2017-07-19 141 views
0

我正在用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

你在表格上創建了​​觸發器嗎?你確定這個錯誤只是因爲這個代碼嗎? –

回答

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