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にできるようにするにはどうすればよいですか?
型付きデータセットは、null許容型をサポートしていません。 null可能columnsをサポートしています。
型指定されたデータセットジェネレーターは、null値を処理するためのnull不可のプロパティと関連メソッドを作成します。 MyDate
タイプのDateTime
列を作成し、AllowDbNull
をtrue
に設定した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つを完全に統合する時間であり、私が知る限り、それ以降、型付きデータセットに新しい機能を追加していません。
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);
Designer
の列のデータベースタイプが間違っているようです。
xsd Designer
を開き、F4
を押してProperties Window
を開きます。適切な列を選択し、Nullable
(またはそのような何か、正確な名前を覚えていない)をtrueに設定します。
これをLINQで機能させるには、dataset.xsdのTablesプロパティに移動する必要があります。まず、列が実際にnullableに設定されていることを確認します。次に、列の特定のプロパティ「NullValue」を確認する必要があります。 Null値のデフォルトは、少なくともVS 2012では「例外」です。LINQのWhere句で「IsNot Nothing」を実行できるように、VBの場合はNothingに設定します。
これにより私の同様の問題が解決されたことに感謝します。これがコードです。この質問の場合
Isevent_start_date()
//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);
}