0

"Input string was not in a correct format"尝试通过 MySQL .NET 连接器更新表时出现错误。

通过 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。谢谢您的帮助!

4

3 回答 3

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 和 %。这是否也会更新:

1001 - amazon order id
10010
10011
10012
10013 
etc.

那是你真正想要的吗?

如果不是,则使用 equal 代替,不带单引号。

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

如果它是您想要的,那么为什么不使用 between 或大于?

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(); 
于 2012-06-29T15:59:46.163 回答
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 攻击。上面的代码假设amazonOrderID数据库中的字段是文本数据类型,amazonOrderID变量是字符串类型。

但是,错误消息说它无法识别输入字符串。
这导致了真正的问题amazonOrderID数据库表中有什么样的列?它是 varchar (或其他文本类型)?还是数字数据类型?

如果它是文本类型,那么如果代码中的 var 也是字符串,则带有like和 参数的语法应该可以工作。 如果列是数字数据类型,则没有意义,您应该使用运算符更改查询,并确保var 是数字类型。amazonOrderID
LIKE=amazonOrderID

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(); 
于 2012-06-29T16:01:37.627 回答
0

我的解决方案实际上是在另一段代码中找到的。在多次运行调试器后,很明显 MySqlConnection 对象试图被实例化两次 - 使用相同的名称等。我删除了第二个实例化,它已经解决了这个问题。太糟糕了,错误误导了。

于 2012-07-24T15:06:32.900 回答