C# - OdbcDataAdapter.Update()导致语法错误

时间:2017-07-19 11:16:21

标签: c# .net ado.net odbc navision

我用C#编写程序,通过ODBC自动在Navision数据库中插入数据。我通过调用OdbcDataAdapter.Fill()方法填充DataTable对象。更改某些值后,我想使用OdbcDataAdapter.Update()更新原始数据库。然而,这总是导致:

  

错误[42000] [Simba] [SimbaEngine ODBC驱动程序] UPDATE项目设置位置=? WHERE((编号<>> =?)AND((?= 1 AND位置为空)或(位置=?)))   错误[42000] [Simba] [SimbaEngine ODBC驱动程序]语法错误。

这是代码:

    static void Main(string[] args)
    {
        DataTable Item = new DataTable();

        OdbcConnection connection = new OdbcConnection("DSN=Navision Frank-Backup");

        connection.Open();
        OdbcDataAdapter adapter = new OdbcDataAdapter();
        adapter.SelectCommand = new OdbcCommand("select \"No.\", \"Location\" from Item where \"No.\" = 'AA0182'", connection);
        OdbcCommandBuilder builder = new OdbcCommandBuilder(adapter);

        adapter.Fill(Item);

        Item.Rows[0].BeginEdit();
        Item.Rows[0]["Location"] = "SW";
        Item.Rows[0].EndEdit();

        adapter.UpdateCommand = builder.GetUpdateCommand();
        adapter.Update(Item);
    }

我希望有人可以帮助我。

编辑:我刚发现如果我手动设置update-command,使用

adapter.UpdateCommand = new OdbcCommand("update Item set Location = 'SW' where \"No.\" = 'AA0182'");

它完美无缺。但是我无法使用该方法,因为我需要更改多个记录。

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。由于某些列名称包含在引号中而发生错误。我需要设置命令构建器的QuotePrefix和QuoteSuffix属性。

以下代码有效:

        static void Main(string[] args)
    {
        DataTable Item = new DataTable();

        OdbcConnection connection = new OdbcConnection("DSN=Navision Frank-Backup");

        connection.Open();
        OdbcDataAdapter adapter = new OdbcDataAdapter();
        adapter.SelectCommand = new OdbcCommand("select \"No.\", Location from Item where \"No.\" = 'AA0182'", connection);
        OdbcCommandBuilder builder = new OdbcCommandBuilder(adapter);
        builder.QuotePrefix = builder.QuoteSuffix = "\"";

        adapter.Fill(Item);

        Item.Rows[0].BeginEdit();
        Item.Rows[0]["Location"] = "TC";
        Item.Rows[0].EndEdit();

        adapter.UpdateCommand = builder.GetUpdateCommand();
        adapter.Update(Item);
        connection.Close();
    }