6

私は何かができるかどうか、そしてそれがそれを行う最も効率的な方法になるかどうかについて一般的な質問があります!

要約すると、オブジェクトコレクションをパラメータとしてストアドプロシージャに渡すことはできますか?

Users [UserID, Forename, Surname] と呼ばれるSQLServerテーブルとと呼ばれる別のテーブルがあるとしましょうHobbies [HobbyID, UserID, HobbyName, HobbyTypeID]

この設定は、ユーザーに対する複数の趣味を記録するためのものです。

私のアプリケーションでは、ユーザーレコードを更新したいと思います。

通常-私はユーザーテーブルを更新してから、コードで各趣味をループし、レコードごとに趣味テーブルを更新します。

ユーザーのフォアネームと2つの趣味を更新する場合、データベースへの3回の呼び出しが必要になります。

(フォアネーム/名前を更新するためのストアドプロシージャへの1回の呼び出し、および2つの趣味のレコードを更新するためのストアドプロシージャへの2回の呼び出し)

私の質問は
、すべてのパラメータを1つのストアドプロシージャに渡すことで、データベースを1回だけ呼び出すことができるかどうかです。

例えば。

intUserID = 1
strForename = "Edward"
strSurname = "ScissorHands"

dim objHobbyCollection as New List(Of Hobby)
'Assume that I have 2 hobby objects, each with their hobbyID, UserID, HobbyName & HobbyTypeID

Dim params As SqlParameter()
params = New SqlParameter() {
    New SqlParameter("@UserID", intUserID),
    New SqlParameter("@Forename", strForename),
    New SqlParameter("@Surname", strSurname),
    New SqlParameter("@Hobbies", objHobbyCollection) 
    }

これはできますか?(そしてどちらの方法がより効率的でしょうか?)ストアドプロシージャはどのようになりますか?

ALTER PROCEDURE [dbo].[User_Update]

 @UserID    INT
,@Forename      NVARCHAR(50) = NULL
,@Surname   NVARCHAR(50) = NULL
,@Hobbies   ??????????????
4

1 に答える 1

12

SQL Server 2008以降を想定すると、テーブル値パラメーターを使用してこれを実行できます。最初にSQLServerでテーブルタイプを作成します。

CREATE TYPE dbo.HobbiesTVP AS TABLE
(
  HobbyID INT PRIMARY KEY,
  HobbyName NVARCHAR(50),
  HobbyTypeID INT
);

次に、ストアドプロシージャは次のようになります。

@Hobbies dbo.HobbiesTVP READONLY

C#では(vb.netに相当するものがわかりません)、次のようになります(ただし、UserIDが1つしかない場合は、コレクションの一部である必要はありませんか?):

// as Steve pointed out, you may need to have your hobbies in a DataTable.

DataTable HobbyDataTable = new DataTable();
HobbyDataTable.Columns.Add(new DataColumn("HobbyID"));
HobbyDataTable.Columns.Add(new DataColumn("HobbyName"));
HobbyDataTable.Columns.Add(new DataColumn("HobbyTypeID"));

// loop through objHobbyCollection and add the values to the DataTable,
// or just populate this DataTable in the first place

using (connObject)
{
    SqlCommand cmd = new SqlCommand("dbo.User_Update", connObject);
    cmd.CommandType = CommandType.StoredProcedure;
    // other params, e.g. @UserID
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@Hobbies", HobbyDataTable);
    tvparam.SqlDbType = SqlDbType.Structured;
    // ...presumably ExecuteNonQuery()
}
于 2012-07-11T20:26:38.150 に答える