XSD DataSetでDBNullからブールへの変換を処理するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/445136

  •  22-07-2019
  •  | 
  •  

質問

私のデータベースでは、テーブルの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の方がはるかに効率的です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top