web-dev-qa-db-ja.com

テーブルはnull可能なDateTimeですが、DataSetは例外をスローしますか?

DataSetデザイナーを使用して、クエリからデータテーブルを作成しようとしています。私はこれをうまく降ろしました。使用されるクエリは、データベースからnull許容の日時列を返します。しかし、このコードに取り掛かると:

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;
    }
}

デザイナーを使用して、この列をnullにできるようにするにはどうすればよいですか?

23
Amy

型付きデータセットは、null許容型をサポートしていません。 null可能columnsをサポートしています。

型指定されたデータセットジェネレーターは、null値を処理するためのnull不可のプロパティと関連メソッドを作成します。 MyDateタイプのDateTime列を作成し、AllowDbNulltrueに設定したDataRowサブクラスは、DateTimeという名前のnull以外のMyDateプロパティ、SetMyDateNull()メソッド、およびIsMyDateNull()メソッドを実装します。つまり、コードでnull許容型を使用する場合は、次のようにする必要があります。

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

これは完全にではなく、型指定されたデータセットを使用する目的に反するものではありませんが、本当にひどいものです。たとえば、型指定されたデータセットがnull可能な列を実装するのは、たとえば、_System.Data_拡張メソッドよりも使いにくい方法です。

型指定されたデータセットdoがnull可能型を使用する場所があるため、特に悪いです。たとえば、上記のnull可能DateTime列を含むテーブルのAdd<TableName>Row()メソッドは、_DateTime?_パラメータ。

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

43
Robert Rossney

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

データベースに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);
1
Fawzy Mokhtar

Designerの列のデータベースタイプが間違っているようです。

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

1

これをLINQで機能させるには、dataset.xsdのTablesプロパティに移動する必要があります。まず、列が実際にnullableに設定されていることを確認します。次に、列の特定のプロパティ「NullValue」を確認する必要があります。 Null値のデフォルトは、少なくともVS 2012では「例外」です。LINQのWhere句で「IsNot Nothing」を実行できるように、VBの場合はNothingに設定します。

1
Jack D Menendez

これにより私の同様の問題が解決されたことに感謝します。これがコードです。この質問の場合

Isevent_start_date()

フィールドがnullかどうかを返します。

私の場合:私は同様の問題があり、次の解決策を使用しました

            //Table's Name is Efforts,
            //Column's name is Target
            //So the dataset would automatically generate a property called IsTargetNull() which can be used to check nullables
            //Create an Adaptor
            EffortsTableAdapter ad = new EffortsTableAdapter();
            ProjectDashBoard.Db.EffortsDataTable efforts = ad.GetData();
            DataColumn targetColumn = new DataColumn();
            targetColumn = efforts.TargetColumn;

            List<DateTime?> targetTime = new List<DateTime?>();
            foreach (var item in efforts)
            {

                //----------------------------------------------------
                //This is the line that we are discussing about : 
                DateTime? myDateTime = item.IsTargetNull() ? null : (DateTime?)item.Target;
                //----------------------------------------------------

                targetTime.Add(myDateTime);

            }
1
Rajesh