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

问题描述:

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

错误[42000] [Simba] [SimbaEngine ODBC Driver] UPDATE Item SET Location =? ((No. < < ??? >> =?)AND((?= 1 AND位置为NULL)或(位置=?))) 错误[42000] [Simba] [SimbaEngine ODBC Driver] Syntax Error。

这是代码:

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'"); 

它完美的罚款。但是我不能使用这种方法,因为我需要更改多个记录。

+0

无法找到指定的查询'UPDATE项设置...'在提供的代码!你确定你已经添加了正确的代码与问题? –

+0

是的,这正是我刚刚使用的代码。 – tubu

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