Чтение данных из файла .dbf с помощью OdbcConnection

Я использую Visual Studio 2010 в Win 7. Я хочу прочитать файл .dbf и получить минимальное значение выбранного столбца.
Вот что у меня есть:

System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=" + ImportDirPath + ";Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
oConn.Open();

// Update time
string nowTime = DateTime.Now.ToString("HHmmss");
oCmd.CommandText = @"UPDATE " + tableName + " SET HQCJBS = " + nowTime + " WHERE HQZQDM = ?";
oCmd.Parameters.AddWithValue("row2", "000000");
oCmd.ExecuteNonQuery();


string query = "SELECT MIN(" + colName + ") FROM " + tableName + " WHERE HQZQDM <> 000000";
OdbcDataAdapter da = new OdbcDataAdapter(query, oConn);
DataSet ds = new DataSet();
da.Fill(ds);

Предположим, colName и tableName верны. У меня два вопроса.


Два вопроса:
Когда набирается код da.Fill(ds);, появляется ошибка data type mismatch in criteria expression access, что не так?
После того, как я получаю минимальное значение из базы данных, как я могу ввести его в память как двойное, например double min = ds.Tables[0];


person sflee    schedule 24.06.2015    source источник
comment
Похоже, что поле «HQZQDM» не числового типа. Это может вызвать ошибку несоответствия типа данных.   -  person Oleg    schedule 24.06.2015


Ответы (1)


Ваша команда обновления должна применять ДВА параметра ... один для набора, другой для предложения where. Использовать "?" заполнитель для каждого из них соответственно и добавьте параметры в том же порядке, в котором они появляются в запросе.

string nowTime = DateTime.Now.ToString("HHmmss");
oCmd.CommandText = @"UPDATE " + tableName + " SET HQCJBS = ? WHERE HQZQDM = ?";
oCmd.Parameters.AddWithValue("setParm", nowTime );
oCmd.Parameters.AddWithValue("whereParm, "000000");
oCmd.ExecuteNonQuery();

Для вашего запроса select MIN () оказывается, что ваш столбец критериев WHERE является строкой, и, имея буквальные числа без кавычек, применяется как числовое ... Опять же, придерживайтесь "?" параметры

OdbcCommand getMinCmd = new OdbcCommand("", oConn);
getMinCmd.CommandText = "SELECT MIN(" + colName 
       + ") FROM " + tableName + " WHERE HQZQDM <> ?";
getMinCmd.Parameters.AddWithValue("whereParm, "000000");

OdbcDataAdapter da = new OdbcDataAdapter(getMinCmd);
DataSet ds = new DataSet();
da.Fill(ds);

Наконец, чтобы получить значение OUT извлеченного запроса в память, вам нужно получить строку таблицы (только 1 набор результатов записи, индекс с отсчетом от нуля) и столбец-0. Поскольку вы не назначили имя столбца, вы не знаете столбец и просто используете 0-индекс ...

int lowestValue = (int)ds.Tables[0].Rows[0][0];

Думайте о вышесказанном как об иерархии ...

ds
  tables[0]
    rows[0]
      [column 0]
    rows[1]  -- but your query would only have one row anyhow
      [column 0]
  tables[1]  -- if your query had multiple queries, this might be available

но, по крайней мере, он показывает, где находятся части.

Теперь, если вы немного измените свой запрос на что-то вроде

select MIN( colName ) as MyMinValue ...

тогда ваша ссылка будет там, где вы явно укажете столбец из полученной строки

int lowestValue = (int)ds.Tables[0].Rows[0]["MyMinValue"];
person DRapp    schedule 24.06.2015