バージョン

ビジネス クラスでのデータの挿入と更新

このヘルプ トピックは、 「WinDataSource のサブクラス化によるビジネス クラスの作成(パート 1)」から始まる 5 つのパートから構成されるチュートリアルの続きです。

前のセクションである 「WinDataSource のサブクラス化によるビジネス クラスの作成(パート 2)」に戻って確認することができます。

挿入と更新を処理するために、OnRowEndEdit イベントを使用できます。このイベントでは基本的に、プライマリ キーを表すフィールドをチェックします。このフィールドの値が 0 より小さい場合、新規レコードで、それ以外の場合は既存レコードです。負数方式を使用する理由は、データベースに負数が格納されないためです。したがって、サーバーによって実際に生成されたプライマリ キー値を取得するまで負数を一時的なクライアント スコープ ID として安全に使用できます。

Visual Basic の場合:

' このイベントは、IBindingList End Edit と同じように発生します。 ここでは、
' 挿入または更新としてデータベースの書き込みます。これを改良して、
' 行がダーティな場合または行が挿入の場合にのみ書き込みを実行できます。
Protected Overrides Sub OnRowEndEdit(ByVal e As Infragistics.Win.UltraWinDataSource.RowEndEditEventArgs)
  MyBase.OnRowEndEdit(e)
	' 変更が False の場合は戻ります。
	Dim cn As New SqlConnection(_cn)
	Dim cm As SqlCommand = cn.CreateCommand()
	Dim strCmd As New System.Text.StringBuilder()
	Dim insert As Boolean = (CType(e.Row.Item("CategoryID"), Integer) < 0)
	If insert Then
		strCmd.Append(" INSERT INTO Categories (")
		strCmd.Append(" CategoryName,")
		strCmd.Append(" Description )")
		strCmd.Append(" VALUES ( ")
		strCmd.Append(" @CategoryName, ")
		strCmd.Append(" @Description) ")
		strCmd.Append("; SELECT @CategoryID=SCOPE_IDENTITY();")
	Else
		strCmd.Append(" UPDATE Categories SET ")
		strCmd.Append(" CategoryName=@CategoryName,")
		strCmd.Append(" Description=@Description ")
		strCmd.Append(" WHERE CategoryID=@CategoryID;")
	End If
	Dim Col As String
	Dim prm As SqlParameter
	Dim i As Integer
	For i = 0 To e.Row.Band.Columns.Count - 1
		Col = e.Row.Band.Columns(i).Key
		prm = cm.Parameters.Add("@" + Col, e.Row.Item(Col))
		Select Case Col
			Case "CategoryID"
				If insert Then
					prm.Direction = ParameterDirection.Output
				End If
			Case Else
				' 他の列をここに記述します。
		End Select
	Next
	cm.Commandtype = CommandType.Text
	cm.Commandtext = strCmd.ToString()
	cn.Open()
	cm.ExecuteNonQuery()
	If insert Then
		e.Row.Band.Columns("CategoryID").readonly = DefaultableBoolean.False
		e.Row.Item("CategoryID") = cm.Parameters("@CategoryID").Value
		e.Row.Band.Columns("CategoryID").readonly = DefaultableBoolean.True
	End If
	cn.Dispose()
End Sub

C# の場合:

// このイベントは、IBindingList End Edit と同じように発生します。ここでは、
// 挿入または更新としてデータベースの書き込みます。これを改良して、
// 行がダーティな場合または行が挿入の場合にのみ書き込みを実行できます。
protected override void OnRowEndEdit(RowEndEditEventArgs e)
{
	base.OnRowEndEdit (e);
	// 変更が False の場合は戻ります。
	SqlConnection cn = new SqlConnection(_cn);
	SqlCommand cm = cn.CreateCommand();
	System.Text.StringBuilder strCmd = new System.Text.StringBuilder();
	bool insert = (bool)((int)e.Row["CategoryID"] < 0);
	if (insert)
	{
		strCmd.Append(" INSERT INTO Categories (");
		strCmd.Append(" CategoryName,");
		strCmd.Append(" Description )");
		strCmd.Append(" VALUES ( ");
		strCmd.Append(" @CategoryName, ");
		strCmd.Append(" @Description) ");
		strCmd.Append("; SELECT @CategoryID=SCOPE_IDENTITY();");
	}
	else
	{
		strCmd.Append(" UPDATE Categories SET ");
		strCmd.Append(" CategoryName=@CategoryName,");
		strCmd.Append(" Description=@Description ");
		strCmd.Append(" WHERE CategoryID=@CategoryID;");
	}
		string col;
		SqlParameter prm;
	for (int i = 0; i < e.Row.Band.Columns.Count; i++)
	{
		col = e.Row.Band.Columns[i].Key;
		prm = cm.Parameters.Add("@" + col, e.Row[col]);
		switch(col)
		{
			case "CategoryID":
				if(insert)
				{
					prm.Direction = ParameterDirection.Output;
				}
				break;
			default:
				// 他の列の特別な処理をここに記述します。
				break;
		}
	}
	cm.Commandtype = CommandType.Text;
	cm.CommandText = strCmd.ToString();
	cn.Open();
	cm.ExecuteNonQuery();
	if(insert)
	{
		e.Row.Band.Columns["CategoryID"].readonly = DefaultableBoolean.False;
		e.Row["CategoryID"] = cm.Parameters["@CategoryID"].Value;
		e.Row.Band.Columns["CategoryID"].readonly = DefaultableBoolean.True;
	}
	cn.Dispose();
}

これは 5 つのパートから構成されるチュートリアルの 3 番目のパートで、次のパートを見たい場合にはリンクをクリックしてください。 WinDataSource のサブクラス化によるビジネス クラスの作成(パート 4)