2017-08-23 3 views
0

ich ein seltsames Problem:C# OdbcDataReader die duplizierte Feldwert erhalten

Datenbank: Firebird Connection String: Driver = {Firebird/Interbase (r) Fahrer}; Dbname = xxx; charset = NONE; UID = xxx; PASSWORT = xxx

ich eine Reihe von ODBC-Klassen für den Betrieb verwenden (wählen), um die Datenbanktabelle

wenn ich Schleife die db Datensätze mit OdbcDataReader.GetValue(), wenn einige Felder (char-Typ) haben kein Wert (char_length() = 0), es würde den letzten Datensatzfeldwert erhalten; wenn Felder den Wert hat, es ist ok (nicht den Wert aus dem letzten Datensatz erhalten)

Mein Code mag unter:

var dr = this.SqlExecutor.Open(sql); //sql is String variable that stored the sql statement 
while (dr.Read()) 
{ 
    this.Logger.Info("-----Customer_Id: " + this.SqlReader.GetFieldAsString(dr, "Customer_Id") + " -----"); // this not duplicated because it's not empty 
    this.Logger.Info("-----Customer_Email: " + this.SqlReader.GetFieldAsString(dr, "Customer_email") + " -----"); //this would if some records has empty value 
} 

// die Methode SqlExecutor.Open (SQL) und SqlReader.GetFieldAsString() finden Sie unter:

public IDataReader Open(string sql) 
    { 
     this.Logger.Debug("sql: " + sql); 
     if (this.reader != null && !this.reader.IsClosed) 
     { 
      this.reader.Close(); 
      this.reader = null; 
     } 

     try 
     { 
      this.cmdForSelect.Connection = this.conn; 
      this.cmdForSelect.CommandTimeout = 120; 
      this.cmdForSelect.CommandText = sql; 

      this.cmdForSelect.Parameters.Clear(); 
      foreach (var p in this.dbParameters) 
      { 
       this.cmdForSelect.Parameters.Add(p); 
      } 

      this.reader = cmdForSelect.ExecuteReader(); 
     } 
     catch (Exception ex) 
     { 
      this.Logger.Error("There is an error: {0}", ex.Message); 
      this.Logger.Info("Error sql query:" + sql); 
      throw; 
     } 
     finally 
     { 
      this.ClearParameters(); 
     } 

     return this.reader; 
    } 


    public string GetFieldAsString(IDataReader dr, string fieldName) 
    { 
     try 
     { 
      var value = dr.GetValue(dr.GetOrdinal(fieldName)); 

      if (value == DBNull.Value) 
      { 
       return string.Empty; 
      } 

      return Convert.ToString(value); 
     } 
     catch 
     { 
      return string.Empty; 
     } 
    } 

Außerdem ist dieser Fall auf meinem Computer in Ordnung, nur zufällig auf Computer meines Kunden, ich fühle mich dies mit mycode spielt keine Rolle, das jemand weiß, bitte helfen Sie mir, vielen dank! !!

Antwort

0

Angenommen, der tatsächliche Code ist nicht in Ihrer Frage veröffentlicht; Ich denke, dass das Problem mit der Wiedereinführung der Variable im tatsächlichen Code ist. Sie müssen den Code erneut überprüfen und überprüfen Sie die IF-ELSE-Bedingung, die Sie auf die this.SqlReader.GetFieldAsString (dr, "Customer_email") angewendet haben

+0

Danke, ich fügen SqlReader.GetFieldAsString(), können Sie bitte helfen, einen Blick daran? –