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

本文关键字:读取 数据 文件 dbf OdbcConnection 使用 | 更新日期: 2023-09-27 17:59:23

我在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];

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

您的update命令应该应用两个参数。。。一个用于集合,另一个用于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-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"];