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

时间:2015-06-24 01:28:21

标签: c# odbc dbf

我在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输入到内存中,例如double min = ds.Tables[0];

1 个答案:

答案 0 :(得分: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();

对于您的选择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"];