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 オブジェクトが同じ名前などで 2 回インスタンス化されようとしていることが明らかになりました。2 回目のインスタンス化を削除したところ、問題は解決しました。エラーが誤解を招くものだったのは残念です。

皆さんの反応に感謝しています。皆さんのおかげでコードが改善されたと感じているので、Jon、Steve、Chris に +1 を付けました。助けてくれてありがとう!

4

3 に答える 3

1

変数はamazonOrderId数値ですか? その場合、変数に対して ToString() を呼び出さずに + 文字列を追加することはできません。

amazonOrderId.ToString() + "%"

データベース内の amazonOrderId は数値ですか? もしそうなら、convert(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またはgreater thanを使用してみませんか?

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変数が文字列型であると想定しています。

ただし、入力文字列を認識できないというエラー メッセージが表示されます。これが本当の問題
につながります。データベーステーブルにはどのような列がありますか? それはvarchar(または他のテキストタイプ)ですか?または数値データ型ですか? amazonOrderID

テキスト型の場合、コード内likeの var も文字列であれば、パラメータとパラメータを使用した構文が機能するはずです。 列が数値データ型の場合は意味がなく、演算子を使用してクエリを変更し、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オブジェクトが同じ名前などで2回インスタンス化されようとしていることが明らかになりました。2番目のインスタンス化を削除すると、問題が解決しました。エラーが誤解を招くのは残念です。

于 2012-07-24T15:06:32.900 に答える