DBDirectMethodsを使用して、ストアドプロシージャの呼び出しを使用してデータベースにデータを挿入する、強く型付けされたデータセットがあります。ストアドプロシージャは、新しく作成されたレコードの主キーを返します。ストアドプロシージャの例は次のとおりです。
CREATE PROCEDURE dbo.CreateUser
(
@UserName VARCHAR(50)
@Password VARCHAR(50)
)
AS
SET NOCOUNT OFF
DECLARE @UserID INT
BEGIN TRANSACTION
INSERT INTO dbo.Users (UserName, Password) VALUES (@UserName, @Password)
SET @UserID = SCOPE_IDENTITY()
INSERT INTO dbo.Users_History (UserID, Status, TimeStamp) VALUES (@UserID, 'C', GETUTCDATE())
COMMIT TRANSACTION
RETURN @UserID
GO
SSMSからストアドプロシージャを実行すると、ユーザーアカウントが作成され、履歴テーブルが更新され、主キーが返されます。強く型付けされたデータセットを使用してアプリケーションを実行し、SQLプロファイラーをチェックすると、同じコードが実行されていることがわかります。ただし、データセットは主キーとして-1を返し、アプリを破壊します。
テーブルアダプタ用にVSで生成されたコード内で、関連する行は次のとおりです。
this._adapter.InsertCommand.CommandText = "dbo.CreateUser";
this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.StoredProcedure;
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.ReturnValue, 10, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@UserName", global::System.Data.SqlDbType.VarChar, 50, global::System.Data.ParameterDirection.Input, 0, 0, "UserName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Password", global::System.Data.SqlDbType.VarChar, 50, global::System.Data.ParameterDirection.Input, 0, 0, "Password", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
と
try {
int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
return returnValue;
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
this.Adapter.InsertCommand.Connection.Close();
}
}
これはすべて、VSが通常生成する標準の定型コードです。手動で編集されたものはありません。戻り値を取得しないだけです。
SQL 2008 R2SP1ExpressでWindows7を実行しています。