XSD DataSetでDBNullからブールへの変換を処理するにはどうすればよいですか?
質問
私のデータベースでは、テーブルの1つにビット(ブール)値の列がいくつかあります。フィールドには常にデータが含まれるとは限らないため、NULLを許可します。
テーブルを使用してXSD DataSetを作成するプロセスを実行し、AllowDBNullフィールドがTrueに設定されていることを確認しました。
ただし、設定されたGetDataメソッドを使用してデータベースからデータテーブルにレコードをプルダウンすると、次のエラーが発生します。
[InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]
列のDefaultValueフィールド以外の何かを指定する必要がありますか、または設定する他のフィールドがありますか?
私はまだこのプロジェクトの開発段階にいるので、フィールドをcharに変更し、Y / N / NULLオプションを使用することが望ましい場合、その方法をとるのはあまり好ましくありません。
解決
私見では、ビット/ブール型フィールドにヌルを許可すべきではありません。
Mike Hadlowの投稿はこちらです:
http://mikehadlow.blogspot.com/2006/10/nullability -voodoo.html
ブール値は、定義によりバイステートタイプです。 NULL可能にすることで、3番目の状態を追加しています。いつかあなたを悩ませるようになります。
他のヒント
私はイアンに反対しなければなりません。 3値ロジックは、2値ロジックと同様に実行可能です。テーブルの人は生きているか死んでいるか、彼が生きているか死んでいるかわからない。マイクが彼の方法を持っていた場合、ここでは少し使用できませんでした。ステータスのテーブルへのFKが必要です。1=生存、2 =死亡、3 =不明です。
ビットの全体的な目的はスペースを節約することで、値をTまたはF、YまたはN(またはU)に制限する制約を使用して、常に列をCHAR(1)にすることができます。
しかし、Iainはマイクが言っていることを誤解していると思います。 Mikeは、プロセスが完了するまでEndDate列はnullであると考えているため、Nullの使用を推奨していません。彼は、列に空値を入れないでください。それは、プロセスが特定の状態にあるかどうかを知るための鍵です。
実際、データベースのNullには特定の非常に有用な副作用があります。 Oracle(おそらく他のデータベース)は、nullのインデックスを作成しません。そのため、重要な値が1つだけの列がある場合(パージすることのない従業員リストと、インデックス付きのIs_Active_Employeeビット列があるなど)。この場合、既存のビジネスの場合、従業員数は>>>です。現在の従業員数よりも多いです。 1%が1%、0%が99%であるとします。
そのインデックスは、必要なサイズの99倍です。テーブルの1%であるため、すべての1にインデックスを付けますが、インデックスを使用して検索することはできませんが、行にも0がロードされます。すべての非アクティブな従業員が必要な場合、インデックス付けされたものは無視され、FTSが実行されます。そのため、データベースの観点からは、1とNULLの方がはるかに効率的です。