2012-06-29 44 views
0

嘗試通過MySQL .NET連接器更新表時遇到錯誤"Input string was not in a correct format"獲取錯誤通過MySQL更新時,輸入字符串格式不正確

update語句在通過MySQL工作臺運行時工作正常,但不通過代碼,我希望有人能告訴我爲什麼。

代碼是:

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId like '" + amazonOrderId + "%';"; 
command.ExecuteNonQuery(); 

我試圖既執行作爲非查詢,並且如的ExecuteReader();沒有運氣。

我相信這是一個簡單的錯誤,但我似乎無法找到它,因此任何幫助將不勝感激。

- 編輯 - 我都試過,沒有運氣以下:

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId like '@amazonOrderId';"; 
command.Parameters.AddWithValue("@amazonOrderId", amazonOrderId); 

也發生了變化的CommandText到:

command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where convert(varchar(50), amazonOrderId) like '" + amazonOrderId + "';"; 

command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId = '@amazonOrderId';"; 

command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId = @amazonOrderId;"; 

- 分辨率 -

我的解決方案實際上是在另一段代碼中找到的。在多次運行調試器後,很明顯MySqlConnection對象試圖實例化兩次 - 具有相同的名稱等。我刪除了第二個實例並解決了問題。錯誤是誤導性的,這太糟糕了。

我很感謝大家的迴應,因爲我覺得他們讓我的代碼更好,因此我給Jon,Steve和Chris +1了。謝謝您的幫助!

+3

第一點:**不要這樣做**。使用參數化的SQL。 –

+0

這有時稱爲「[Bobby Tables](http://xkcd.com/327/)」。 – dasblinkenlight

+0

你可以調試並查看實際查詢文本嗎?我敢打賭,你的訂單ID中有一個逗號或者其他東西 - 也不是MySql使用反引號來識別數據庫對象嗎?什麼方法的錯誤(你可以發佈堆棧?) – Charleh

回答

0

我的解決方案實際上是在另一段代碼中找到的。在多次運行調試器後,很明顯MySqlConnection對象試圖實例化兩次 - 具有相同的名稱等。我刪除了第二個實例並解決了問題。錯誤是誤導性的,這太糟糕了。

1

變量amazonOrderId是否爲數字?如果是這樣,你不能在變量上調用ToString()的時候不給它添加一個字符串。

amazonOrderId.ToString() + "%" 

是數據庫中的amazonOrderId數字嗎?如果是這樣,你有沒有嘗試轉換(varchar)?

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where convert(varchar(50), amazonOrderId) like @OrderID;"; 
command.Parameters.AddWithValue("@orderID", amazonOrderId + "%"); 
command.ExecuteNonQuery(); 

但我不知道爲什麼你需要LIKE WITH%。這也會更新:

1001 - amazon order id 
10010 
10011 
10012 
10013 
etc. 

這是你真正想要的嗎?

如果不是,則使用平等而不使用單引號。

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId = @OrderId;"; 
command.Parameters.AddWithValue("@orderID", amazonOrderId); 
command.ExecuteNonQuery(); 

如果它是你想要的,那麼爲什麼不用它們之間或大於?

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId > @OrderId;"; 
command.Parameters.AddWithValue("@orderID", int.Parse(amazonOrderId.ToString() + "0")); 
command.ExecuteNonQuery(); 
+0

nm先前的評論,我會嘗試將amazonOrderID轉換爲varchar。 –

+0

我無法對此表示贊同,因爲它不使用參數化SQL,即使我認爲您對問題的原因100%正確:( – dasblinkenlight

+0

@dasblinkenlight - 我只是指出用戶代碼解決錯誤的問題。我通常不喜歡去關注範圍,並開始同時糾正其他問題,因爲OP可能不知道哪個校正實際上糾正了錯誤,使用了參數或使用了convert函數。雖然我覺得簡單的說明已經足夠了 –

1

也許你需要使用參數

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId like @orderID"; 
command.Parameters.AddWithValue("@orderID", amazonOrderId + "%"); 
command.ExecuteNonQuery(); 

這將避免出現錯誤時,該參數值是一個字符串,包含單引號和防止SqlInjection attacks。 上面的代碼假定數據庫中的amazonOrderID字段是文本數據類型,amazonOrderID變量是字符串類型。

但是,錯誤消息說它不能識別輸入字符串。
這導致實際問題。數據庫表中的amazonOrderID是什麼樣的列? 它是varchar(或其他文本類型)?或者是一個數字數據類型?

如果是文本類型,那麼like和參數的語法應該工作,前提是代碼中的amazonOrderID var也是一個字符串。
如果該列是數字數據類型,那麼LIKE沒有意義,您應該使用=運算符更改查詢,並且確保amazonOrderID var是數字類型。

MySqlCommand command = new MySqlCommand(); 
command.Connection = conn; 
command.CommandText = "update fulfilled_shipments_data set addedCustomer=1 where amazonOrderId = @orderID"; 
command.Parameters.AddWithValue("@orderID", amazonOrderId); 
command.ExecuteNonQuery();