如何从C#更新行dbf文件?

时间:2018-02-07 21:21:50

标签: c# visual-foxpro dbf pdb-files

我在.dbf文件中有一个表,我想更新一行或多行,但是当我运行项目并执行命令查询时,我得到了异常:

  

错误[HY000] [Microsoft] [ODBC dBase驱动程序]外部表格不是预期的格式。

1 个答案:

答案 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'等等 - 也就是位置参数)。