C# の Null は SQL の NULL とは異なります。SQL の NULL は C# では DBNull.Value として表されます。
注: SQL パラメーターは C# の null 値を受け入れることができません。null が渡されると、エラーが報告されます。
以下の例を見てみましょう:
1 SqlCommand cmd=new SqlCommand("Insert into Student values(@StuName,@StuAge)" ,conn);2 cmd.parameters.add("@StuName" ,stuName);3 cmd.parameters.add("@StuAge" ,stuAge);4 cmd.ExecuteNonQuery();
上記のコードには問題がないように見えますが、実際には、stuName または stuAge の値が null の場合、例外がスローされます。では、どうすれば解決できるでしょうか?
解決策: stuName または stuAge の値が null の場合は、DBNull.Value を渡します。次に、渡されたパラメータ値を判定するための静的汎用メソッドを作成し、null の場合は DBNull.Value を返し、それ以外の場合は元の値を返します。
1 public static object SqlNull(object obj) 2 { 3 if(obj == null) 4 { 5 return DBNull.Value; 6 } 7 else 8 { 9 return obj;10 } 11 }
上記のメソッドを呼び出した後のコードは次のとおりです:
1 SqlCommand cmd=new SqlCommand("Insert into Student values(@StuName,@StuAge)" ,conn);2 cmd.parameters.add("@StuName" ,SqlNull(stuName));3 cmd.parameters.add("@StuAge" ,SqlNull(stuAge));4 cmd.ExecuteNonQuery();
さらに、パラメータ値がコントロール (テキスト ボックスなど) の値から取得される場合、渡されるパラメータ値はnullであること(コントロールの値がnullにならないため、値がなくても「」になります) コントロールの値が「」の場合(文字が入力されていない場合など)。テキスト ボックス内))、データ テーブルのフィールド値が NULL の場合、SqlNull メソッドを少し変更するだけで済みます:
1 public static object SqlNull(object obj) 2 { 3 if(obj == null || obj.ToString() == "") 4 { 5 return DBNull.Value; 6 } 7 else 8 { 9 return obj;10 } 11 }
拡張:
SQL パラメータを渡すときに、次のようにパラメータ グループを渡すこともできます:
1 SqlParameter[] parm = new SqlParameter[] 2 { 3 new SqlParameter("@StuName", SqlNull(stuName)), 4 new SqlParameter("@StuAge", SqlNull(stuAge)) 5 } 6 if(parm != null) 7 { 8 cmd.Parameters.AddRange(parm); 9 }10 cmd.ExecuteNonQuery();
注: new SqlParameter のパラメータ値 (パラメータ名、パラメータ値) も null 値を受け入れません。また、parm パラメータ グループも、if(parm != null の判断) である null を受け入れません。 ) をそれ以下にすることはできません。
以上がC#でSQLパラメータにnull値を渡すときのエラーとその解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。