使用 OdbcConnection 从 .dbf 文件中读取数据

Read Data from .dbf File with OdbcConnection

我在 Win 7 上使用 visual studio 2010。我想读取一个 .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);

假设colNametableName是正确的。我有两个问题。


两个问题
当代码da.Fill(ds);被命中时,我得到了一个错误data type mismatch in criteria expression access,有什么问题吗?
从数据库中获取最小值后,如何将其作为双精度输入到内存中,例如 double min = ds.Tables[0];

您的更新命令应应用两个参数...一个用于集合,另一个用于 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存入内存,还需要获取table的行(只有1条记录结果集,从零开始的索引)和column-0。由于您没有分配列名,因此您不知道该列,只需使用 0-index...

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"];