2014-10-22 20 views
0

我在更新數據庫中的一行時出現此錯誤。wcf服務應用程序中的更新錯誤

類型「System.Data.OleDb.OleDbException」的異常出現在System.Data.dll中,但在用戶代碼中沒有處理

附加信息:在UPDATE語句的語法錯誤。

無法調用服務。可能的原因:服務處於脫機狀態或無法訪問;客戶端配置與代理不匹配;現有的代理無效。有關更多詳細信息,請參閱堆棧跟蹤。您可以嘗試通過啓動新代理,還原爲默認配置或刷新服務來進行恢復。

這是我的更新代碼:

public string UpdateInventory(string name, int quantity) 
{ 
     string strMessage = string.Empty; 
     string sql; 

     //Create connection object 
     OleDbConnection oleConn = new OleDbConnection(connString); 
     oleConn.Open(); 

     //Update a row 
     sql = "UPDATE Product SET Quantity Attribute = '" + quantity + "' WHERE Name = '" + name + "'"; 

     OleDbCommand cmd = new OleDbCommand(sql, oleConn); 

     int rowsAffected = (int)cmd.ExecuteNonQuery(); 

     if(rowsAffected > 0) 
     { 
      strMessage = name + "Details updated succesfully"; 
     } 
     else 
     { 
      strMessage = name + "Details not updated successfully"; 
     } 

     oleConn.Close(); 

     return strMessage; 
} 

但如果我更新十進制價格和字符串描述具有相同的代碼。它進展順利。它只是在更新數量時獲取該代碼。

+0

[SQL注入警報](http://msdn.microsoft.com/zh-cn/library/ms161953%28v=sql.105%29。aspx) - 你應該**不**連接你的SQL語句 - 使用**參數化查詢**來代替以避免SQL注入 – 2014-10-22 06:12:08

+1

圍繞'Quantity Attribute'使用括號來處理空間 - 'UPDATE Product SET [Quantity Attribute]'修復語法錯誤的最可能原因。而當你在,做@marc_s說,並改變你的代碼使用參數化查詢。 – Tim 2014-10-22 06:56:04

回答

0

您的列名稱Quantity Attribute中有一個空格,這很可能導致語法錯誤。您可以使用列名稱周圍的括號來解決此問題。另外,quantityint,您試圖將其用作SQL命令中的字符串。表中最有可能的也是int,所以圍繞該值不需要',但不知道表的模式只是一個猜測。

您的代碼最大的問題是它容易受到SQL注入攻擊。你可以通過使用參數化查詢來防範這種情況。參數化查詢還有一個額外好處,即根據各個參數的類型處理所需的所有值。

最後,認爲最好使用using塊進行連接,即使出現錯誤,當using塊退出時,也會爲您關閉和處理連接。

下面是包裝這一切了一個例子:

try 
{ 
    using (OleDbConnection oleConn = new OleDbConnection(connString)) 
    { 
     oleConn.Open(); 

     //Update a row 
     sql = "UPDATE Product SET [Quantity Attribute] = ? WHERE Name = ?"; 

     OleDbCommand cmd = new OleDbCommand(sql, oleConn); 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.Add("@Quantity", OleDbType.Int).Value = quantity; 
     cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = name; 

     int rowsAffected = (int)cmd.ExecuteNonQuery(); 

     if(rowsAffected > 0) 
     { 
      strMessage = name + "Details updated succesfully"; 
     } 
     else 
     { 
      strMessage = name + "Details not updated successfully"; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    strMessage = String.Format("Update error: {0}", ex.Message); 
} 

注意,對於OleDb的問號被用作參數的佔位符,所以在其中添加參數的順序是非常重要的 - 他們必須匹配查詢字符串中佔位符的順序。

產生的SQL是這樣的(假設數量屬性是一個int,和quantity = 20和name =「樣本」:

UPDATE Product SET [Quantity Attribute] = 20 WHERE Name = 'Sample' 

作爲最後的建議我還包裹代碼在試戴catch塊,所以如果拋出一個異常,它會被捕獲和處理,未處理的異常也可以揭示你的程序不應該被泄露的信息(因爲它可以給潛在的黑客提供更多的信息來優化你的系統的嘗試)。這是一個WCF服務,具體取決於您的配置異常詳細信息可能會返回給客戶端,也可能不會返回給客戶端,但未處理的異常可能會導致您的服務中斷,並且w對客戶的服務渠道不負責任。

相關問題