c# 代入 - テーブルはnullable DateTimeですが、DataSetは例外をスローしますか?




system.dbnull' のオブジェクトを型 (8)

私は、データセットデザイナーを使用してクエリからデータテーブルを作成しようとしています。 私はちょうどいいこれを得た。 使用されたクエリは、データベースからNULL可能なdatetime列を返します。 しかし、このコードに近づくと:

DataSet1.DataTable1DataTable table = adapter.GetData();

これによりStrongTypingExceptionがスローされます。

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public System.DateTime event_start_date {
    get {
        try {
            return ((global::System.DateTime)(this[this.tableDataTable1.event_start_dateColumn]));
        }
        catch (global::System.InvalidCastException e) {
            throw new global::System.Data.StrongTypingException("The value for column \'event_start_date\' in table \'DataTable1\' is DBNull.", e);
        }
    }
    set {
        this[this.tableDataTable1.event_start_dateColumn] = value;
    }
}

デザイナを使用してこの列をNullableにする方法を教えてください。


Answers

DataTableとStrongly Typed DataTableでは違います。Useこのようにします。

DataSet1.DataTable1DataTable table = new DataSet1.DataTable1DataTable();
table.Merge(adapter.GetData().CopyToDataTable());

私はDateTime列に値NULLを挿入するためにこれを行いましたが、

データベースにnullable DateTime列があると仮定して、私はresponseというオブジェクトのデータベースからいくつかのデータを取得し、 RenewDateと呼ばれるDataSet列にnullable DateTime値を挿入します。

// create anew row of the same type of your table row
var rw = ds.StudentActionPrintDT.NewStudentActionPrintDTRow();

// check for null value
if(!response.RenewDate.HasValue)
{
  // if null, then the let DataSet to set it null by it's own way 
  rw.SetRenewDateNull();
}
else
{
  // if not null set value to the datetime value
  rw.RenewDate = response.RenewDate.Value;
}
// add the created row to the dateset [DataSetName].[ColumnName].Add[ColumnName]Row([The Created Row]);
ds.StudentActionPrintDT.AddStudentActionPrintDTRow(rw);

これをLINQで動作させるには、dataset.xsdのTablesプロパティに移動する必要があります。 最初に見て、列が実際にnullableに設定されていることを確認します。 次に列の特定のプロパティ "NullValue"を調べる必要があります。 Null Valueは、少なくともVS 2012では "Exception"にデフォルト設定されています.LINQ Where句に "IsNot Nothing"を実行できるように、VBではNothingに設定します。


Designerは、列のデータベースの種類が間違っているようだ。

xsd Designer開き、 F4を押してProperties Window開きます。 適切な列を選択し、 Nullable (またはそのようなもの、正確な名前を覚えていないもの)をtrueに設定します。


私は、データシートに読み込まれているExcelシートのヌルセルを処理するために、以下のコードを使用しています。

if (!reader.IsDBNull(0))                                
{                                    
  row["DateOnCall"] = (DateTime)reader[0];
}

型付きデータ・セットは、NULL可能型をサポートしていません。 それらはヌル可能なをサポートします

型付きデータ・セット・ジェネレーターは、ヌル値を処理するためのヌル可能でないプロパティーおよび関連メソッドを作成します。 DateTime型とAllowDbNull型のMyDate列をtrueに設定すると、 DataRowサブクラスは、 MyDateSetMyDateNull()メソッド、およびSetMyDateNull()メソッドという名前のnullableでないDateTimeプロパティを実装します。 つまり、コードでnull可能な型を使用する場合は、これを行う必要があります。

DateTime? myDateTime = myRow.IsMyDateNull() ? null : (DateTime?) row.MyDate;

これは、型付きデータセットを使用する目的を完全に打ち負かすわけではありませんが、実際は駄目です。 型付きデータセットでは、たとえば、 System.Data拡張メソッドよりも使用しにくい方法でnull可能な列が実装されているのはSystem.Dataです。

型付きデータセットで 、一部の場所でnull可能な型を使用するため、特に悪いです。たとえば、上記のnull可能なDateTime列を含むテーブルのAdd<TableName>Row()メソッドはDateTime? パラメータ。

以前は、MSDNフォーラムでこの問題について尋ねました。最終的には、ADOのプロジェクトマネージャーは、null可能な型が型指定されたデータセットと同時に実装されていると説明しました。そのチームは.NETで完全に2つを統合する時間がありませんでした2.0の出荷日。 そして、私が知る限りでは、型付きデータセットに新しい機能を追加していません。


System.DateTimeオブジェクトはnull可能ではありません。 DateTimeをnullにすると、それはDateTimeになりますか? (DateTimeの後に?を付ける)

DateTime? nullableDateTime = null;

null可能な型を許可するのは良い点だと私は同意します。

"(例外をスローする)"ではなく、列の "NullValue"プロパティを "-1"に設定すると、例外がスローされる代わりに列がnullのときにプロパティが-1を返します。 ヌルを許可するように列を設定する必要があります。

また、常にデータ型を "System.Object"に設定し、nulls = trueを許可することもできます。 「IsMyFieldNull()」メソッドを使用することなく、列の値にアクセスできます。 列がnullの場合、列の値は "System.DbNull.Value"になります。 "System.DbNull.Value"を使用したくない場合は、 "(例外をスローする)"の代わりに "NullValue"プロパティを "(Nothing)"に設定し、オブジェクトをnull参照と比較することができます。





c# dataset