【问题标题】:C# - OdbcDataAdapter.Update() results in Syntax ErrorC# - OdbcDataAdapter.Update() 导致语法错误
【发布时间】:2017-07-19 11:16:20
【问题描述】:

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

错误 [42000] [Simba][SimbaEngine ODBC 驱动程序]UPDATE Item SET Location = ? WHERE ((No. >= ?) AND ((? = 1 AND Location IS NULL) OR (Location = ?))) ERROR [42000] [Simba][SimbaEngine ODBC Driver]语法错误。

这是代码:

    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);
    }

我希望有人能帮我解决这个问题。

编辑:我刚刚发现如果我手动设置更新命令,使用

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

它工作得很好。但是我不能使用该方法,因为我需要更改多条记录。

【问题讨论】:

  • 未能在提供的代码中找到指定的查询UPDATE Item SET ...!你确定你在问题中添加了正确的代码吗?
  • 是的,这正是我刚刚使用的代码。
  • 您已经在表上创建了触发器?你确定错误只是因为这个代码吗?
  • 不,我没有创建触发器。
  • 您真的在列名(“No.”)中有一个点(.)吗?你能试着把那一列去掉,看看它是否有效?

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


【解决方案1】:

我自己找到了解决方案。发生错误的原因是某些列名用引号引起来。我需要设置命令生成器的 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();
    }

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多