C# odbcDatareader получить дублированное значение поля

У меня странная проблема:

База данных: Строка подключения Firebird: Драйвер ={Драйвер Firebird/InterBase(r)};Dbname=xxx;CHARSET=NONE;UID=xxx; PASSWORD= ххх

Я использую набор классов ODBC для работы (выбрать) таблицу базы данных

Когда я зацикливаю записи БД с помощью OdbcDataReader.GetValue(), если некоторые поля (тип char) не имеют значения (char_length()=0), он получит значение поля последней записи; если поля имеют значение, это нормально (не получает значение из последней записи)

Мой код нравится ниже:

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 
}  

// метод SqlExecutor.Open(sql) и SqlReader.GetFieldAsString(), пожалуйста, обратитесь к ниже:

    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;
        }
    }

Кроме того, это нормально на моем компьютере, только что произошло на компьютере моего клиента, я чувствую, что это не имеет значения с моим кодом, кто-нибудь знает это, пожалуйста, помогите мне, большое спасибо!!!

1 ответ

Предполагая, что фактический код не опубликован в вашем вопросе; Я думаю, что проблема заключается в повторной инициализации переменной в реальном коде. Вам необходимо вернуться к коду и проверить условие IF-ELSE, которое вы применили к this.SqlReader.GetFieldAsString(dr, "Customer_email")

Другие вопросы по тегам