by WebSurfer
2017年6月18日 18:02
Visual Studio のデータソース構成ウィザードを使って、@IT の記事「Microsoft Visual Studio 2005 による Web アプリケーション構築技法」の「D. テーブルアダプタへのクエリ追加」のセクションに書いてあるように、特定の条件で DataSet / DataTable を生成するメソッドを作ることができます。
以下の画像はサンプルデータベース Northwind の Orders テーブルから ShippedDate が NULL のレコードを抽出して DataGridView に表示したものですが、このようなことができるメソッドを作るにはどうすればよいかということを書きます。
SELECT クエリで WHERE ShippedDate = @ShippedDate という条件で TableAdapter にメソッドを追加すると、そのメソッドの引数に null が渡された場合は、メソッド内部でパラメータ @ShippedDate に DBNull.Value が代入されるコードが生成されます。
しかしながら、それでは ShippedDate が NULL のレコードを抽出することはできません。ShippedDate が NULL のレコードを抽出するためには WHERE ShippedDate IS NULL とする必要があります。
ではどうすればいいかですが、クエリビルダで元となる SELECT クエリを作成する際、@IsNull_ShippedDate(名前は任意)というような引数に null が渡されたか否かを判定するパラメータを追加し、以下の画像のように WHERE 句を組み立ててそれをベースにメソッドを生成します。
これにより、DataTable を返す GetDataByNullableShippedDate メソッド(名前は任意)の例ですが、以下のようなコードが生成されます。(注:自動生成されたコードそのものではなく、読みやすくするため改行等を行っています)
public virtual OrdersDataTable GetDataByNullableShippedDate(
int? IsNull_ShippedDate, DateTime? ShippedDate)
{
this.Adapter.SelectCommand = this.CommandCollection[1];
if (IsNull_ShippedDate.HasValue == true)
{
this.Adapter.SelectCommand.Parameters[0].Value =
(int)IsNull_ShippedDate.Value;
}
else
{
this.Adapter.SelectCommand.Parameters[0].Value =
DBNull.Value;
}
if (ShippedDate.HasValue == true)
{
this.Adapter.SelectCommand.Parameters[1].Value =
(DateTime)ShippedDate.Value;
}
else
{
this.Adapter.SelectCommand.Parameters[1].Value =
DBNull.Value;
}
OrdersDataTable dataTable = new OrdersDataTable();
this.Adapter.Fill(dataTable);
return dataTable;
}
この GetDataByNullableShippedDate メソッドを以下のように呼び出して DataTable を取得し DataGridView に表示したのが一番上の画像です。
public partial class Form14 : Form
{
private OrdersTableAdapter adapter = new OrdersTableAdapter();
private BindingSource bindingSource1 = new BindingSource();
private NorthwindDataSet.OrdersDataTable table;
public Form14()
{
InitializeComponent();
DateTime? shippedDate = null;
table = adapter.GetDataByNullableShippedDate(
shippedDate.HasValue ? 0 : 1, shippedDate);
bindingSource1.DataSource = table;
this.dataGridView1.DataSource = bindingSource1;
}
}
もちろん、NULL でない特定の日付の ShippedDate のレコードも上のコードで抽出できます。