我在.dbf
文件中有一个表,我想更新一行或多行,但是当我运行项目并执行命令查询时,我得到了异常:
错误[HY000] [Microsoft] [ODBC dBase驱动程序]外部表格不是预期的格式。
答案 0 :(得分:1)
private void updateValesPonyNumeroFactura(ref string error)
{
string pathFile = @"c:\Temp\";
OleDbConnection con = new OleDbConnection(GetConnection(pathFile));
try
{
string updateRow = $"UPDATE vale.dbf SET Factura = 'c00001' WHERE vale = '011395'";
OleDbCommand cmd = new OleDbCommand(updateRow, con);
con.Open();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
System.Data.DataSet ds = new System.Data.DataSet();
da.Fill(ds, "MyTable");
con.Close();
}
catch (Exception ex)
{
}
finally
{
con.Close();
}
}
private static string GetConnection(string path)
{
return $"Provider=vfpoledb;Data Source={path};Collating Sequence=machine;";
}
这是解决方案,我不知道数据集是否必要,但是它有效。
编辑(Cetin Basoz) 免责声明:我不能写这个作为答案,因为不幸的是,它被搁置了。我添加这个来解释原因和其他一些细节。
您的原始代码不起作用,因为您使用了ODBC连接,而您使用的表是6以后的版本.VFP的上一个ODBC驱动程序支持最多包含6的结构。
其次,在您的代码中使用DataSet或DataAdapter是必要的。事实上,使用DataAdapter可能会导致更新失败,因为隐式命令构建器不会写入插入,而是始终正确地更新代码。这是您的更新的修订版本。同样在此代码中,不是对要更新的值进行硬编码,而是通过参数传递值(在现实场景中应该是这种情况):
private void updateValesPonyNumeroFactura(ref string error)
{
string pathFile = @"c:\Temp\";
using (OleDbConnection con = new OleDbConnection(GetConnection(pathFile)))
{
try
{
string updateRow = $"UPDATE vale SET Factura = ? WHERE vale = ?";
OleDbCommand cmd = new OleDbCommand(updateRow, con);
cmd.Parameters.Add('factura', OleDbType.VarChar);
cmd.Parameters.Add('vale', OleDbType.VarChar);
cmd.Parameters['factura'].Value = "c00001";
cmd.Parameters['vale'].Value = "011395";
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
error = ex.Message;
}
finally
{
con.Close();
}
}
}
请注意,使用OleDb参数占位符只是?标记,它们受添加到参数集合的顺序的约束。参数名称只是开发人员的帮助者(首先?绑定到'factura'参数,第二个绑定到'vale'等等 - 也就是位置参数)。