使用 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);
假设colName
和tableName
是正确的。我有两个问题。
两个问题:
当代码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"];
我在 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);
假设colName
和tableName
是正确的。我有两个问题。
两个问题:
当代码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"];