2009-04-25 19 views
2

私はVS2008データセットデザイナを使用してデータセットを設計しました。データ型の1つでは、ほとんどの列の "AllowDBNull"プロパティをFalseに設定しました。ただし、これらの列にnull値を含むDataRowを作成しても、このデータテーブルはエラーなしでこの行を受け入れます。AllowDBNull = Falseの場合でもNull値を許可するデータセット?

ここに何か分かりませんか?ご意見をお聞かせください。ありがとうございました。

編集マイク・スロスの優れた説明は、しかし、別の質問をもたらします。 System.DBNullの場合、テキストフィールドをどのようにチェックするのですか? DataSetsが文字列をSystem.DBNullとして考慮しておらず、例外をスローしていることは驚くべきことです。それとも?

編集私は問題とその理由を発見したと思います。私はその行に値を入力する前に、DataTableの新しい行を初期化しています。行を初期化する際に、文字列のデフォルト値、つまり ""がその列に入力されている可能性があります。私はそれだと思いますか?これについてのアイデアは?

答えて

13

短い答えは:

System.DBNull.Value != null

長い答えは:C#、というコンセプトで

は、 NULL SQLの値はで表されます。クラスSystem.DBNullのプロパティです。データベースを扱う場合、C#nullは実際には「null値」を意味しません。

nullにデータベース列を設定すると、ADO.NETはその列の既定値が何であれ、列を初期化します(たとえば、int列は0に初期化されます)。つまり、nullを使用すると、実際にはNULL以外の値がデータベースに格納される可能性があります。したがって、エラーは発生しません。

データベース列をSystem.DBNull.Valueに設定すると、列は実際にはNULLに設定されます。これは、AllowDBNulls == falseがあなたの行為を妨げる状況です。

+0

優秀な説明+1 –

+0

説明をありがとう。 – virtualmic

+0

私は少し前にこの回答を受け入れましたが、ただちにそれを受け入れませんでしたので、それ以降の質問に対する回答を提供することができます。それが起こるとすぐに私はそれを受け入れます。 – virtualmic

0

これらの列にNULL値または空の文字列を正確に割り当てていますか?列に値を代入しないと、デフォルト値はNULLになります(DEFAULT制約が課せられていない場合)。そうでなければNULL値を割り当てることができます。 -

ds.Tables[0].Rows[0]["Col"] = null; 

これらの列に空の文字列を割り当てる場合、NULLに等しくありません。

そして、あなたがNULL可能でないとしてマークされた列にNULL値を持っている場合、それはエラーがスローされます -

列「のCol1は、」NULLを許可しません。

EDIT:NOT NULLABLEことで

が、私は偽= AllowDBNullを意味します。

コードが正しいようです。テキストをトリミングできますか?

ここでは、全体のコードです -

DataTable dt = new DataTable(); 

DataColumn column = new DataColumn("Col1"); 
column.AllowDBNull = false; 
dt.Columns.Add(column); 

DataRow dr = dt.NewRow(); 
dr["Col1"] = null; 

dt.Rows.Add(dr); 
+0

私は、テキストボックスを持っていると私は、次のコードを使用しています: 場合(this.nameTextBox.Text == "") DR [DB.vinDataSet.item.nameColumn] = NULLを。 else { dr [DB.vinDataSet.item.nameColumn] = this.nameTextBox.Text; } しかし、明示的にnameColumnをnullに設定しても、DataTableに行を入力できます。 ところで、 "NOT NULLABLE"プロパティは何ですか?私が見ることのできるのは、DataSet Designerの "AllowDBNull"だけです。 – virtualmic

2

あなたの "bonus" ;-)質問:NULL(文字列なし)と ""(空文字列)は2つの異なるものです。したがって、それらを別々に扱うことは完全に合理的です。それは物事を台無しにしているnullとDBNullの区別です。 ADO.NETの設計時にNULL値型が使用可能だった場合、おそらくもっと簡単になるでしょう。しかし、.NET 2.0以前は、例えば、 「ヌル整数」

関連する問題