SQL Server 2005 データベースがあります。いくつかのプロシージャには、テーブル パラメータがあり、それを (カンマで区切られた) としてストアド プロシージャに渡しnvarchar
、内部で単一の値に分割します。次のようにして、SQL コマンド パラメータ リストに追加します。
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
データベースを SQL Server 2008 に移行する必要があります。テーブル値パラメータがあることはわかっていますし、ストアド プロシージャでそれらを使用する方法もわかっています。しかし、SQL コマンドのパラメータ リストに渡す方法がわかりません。
誰かこの手順の正しい構文を知っていますかParameters.Add
? または、このパラメータを渡す別の方法はありますか?
ベストアンサー1
DataTable
、、DbDataReader
またはIEnumerable<SqlDataRecord>
オブジェクトを使用して、MSDNの記事に従ってテーブル値パラメータを設定できます。SQL Server 2008 (ADO.NET) のテーブル値パラメータ。
次の例は、DataTable
または のいずれかの使用を示していますIEnumerable<SqlDataRecord>
。
SQL コード:
CREATE TABLE dbo.PageView
(
PageViewID BIGINT NOT NULL CONSTRAINT pkPageView PRIMARY KEY CLUSTERED,
PageViewCount BIGINT NOT NULL
);
CREATE TYPE dbo.PageViewTableType AS TABLE
(
PageViewID BIGINT NOT NULL
);
CREATE PROCEDURE dbo.procMergePageView
@Display dbo.PageViewTableType READONLY
AS
BEGIN
MERGE INTO dbo.PageView AS T
USING @Display AS S
ON T.PageViewID = S.PageViewID
WHEN MATCHED THEN UPDATE SET T.PageViewCount = T.PageViewCount + 1
WHEN NOT MATCHED THEN INSERT VALUES(S.PageViewID, 1);
END
C# コード:
private static void ExecuteProcedure(bool useDataTable,
string connectionString,
IEnumerable<long> ids)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "dbo.procMergePageView";
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter;
if (useDataTable) {
parameter = command.Parameters
.AddWithValue("@Display", CreateDataTable(ids));
}
else
{
parameter = command.Parameters
.AddWithValue("@Display", CreateSqlDataRecords(ids));
}
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "dbo.PageViewTableType";
command.ExecuteNonQuery();
}
}
}
private static DataTable CreateDataTable(IEnumerable<long> ids)
{
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(long));
foreach (long id in ids)
{
table.Rows.Add(id);
}
return table;
}
private static IEnumerable<SqlDataRecord> CreateSqlDataRecords(IEnumerable<long> ids)
{
SqlMetaData[] metaData = new SqlMetaData[1];
metaData[0] = new SqlMetaData("ID", SqlDbType.BigInt);
SqlDataRecord record = new SqlDataRecord(metaData);
foreach (long id in ids)
{
record.SetInt64(0, id);
yield return record;
}
}