5

次のようなMySQLストアドプロシージャで呼び出されるパラメーターを追加しています

List<MySqlParameter> MyParams = new List<MySqlParameter>();    
MyParams.Add(new MySqlParameter("MyId", 0));

しかし、何らかの理由で、コードをステップ実行するときに MyParams、MyId の値を見ると、null に変換されます。以下のようにint変数から値を代入すれば問題ないので、これがなぜなのか誰にもわかりますか

int id = 0;
List<MySqlParameter> MyParams = new List<MySqlParameter>(); 
MyParams.Add(new MySqlParameter("MyId", id));
4

3 に答える 3

9

さて、リテラルを暗黙的0に変換できるC#のコーナーケースに陥りましたEnum

暗黙の列挙型変換により、10 進整数リテラル 0 を任意の列挙型に変換できます。

参照

そのため、結果として値が無視されるのではなく、new MySqlParameter("MyId", 0)コンパイルされます。MySqlParameter(string,MySqlDbType)MySqlParameter(string,object)0

new MySqlParameter("MyId", id)列挙型への暗黙的な変換は、値がliteralfor でない場合にのみ機能するため、これは機能しvariablesます。したがって、これがコンパイルされてMySqlParameter(string,object)、期待される結果が得られることは明らかです。

new MySqlParameter("MyId", (object)0)//this solves the problem

またはこれ

New MySqlParameter("MyId", MySqlDbType.Int).Value = 0

@MyIdところで@Suraj Singhが指摘したように、の代わりに使用する必要があるかもしれませんMyId

お役に立てれば

于 2013-09-13T15:23:36.470 に答える
2

コンストラクターのこのオーバーロードを使用してSqlParameter整数パラメーター値を指定する場合は注意してください。このオーバーロードは Object 型の値を取るため、値が 0 の場合は整数値を Object 型に変換する必要があります --- MSDNにも 適用できることを願っていMySqlます。

MyParams.Add(New MySqlParameter("@MyId", MySqlDbType.int)).Value = 0;

または試す

Parameters.AddWithValue("@MyId", 0);
于 2013-09-13T14:15:48.583 に答える
0

データベース スキーマで、MyId は int 型の主キーですか? allow null を yes に設定しますか?

null を許可する PK に値 0 を割り当てると、NULL が割り当てられます。コードに問題があるのではなく、データベースの設定に問題があると思われます。

于 2013-09-13T13:53:39.420 に答える