.net コードからストアド プロシージャにテーブル値パラメータを渡す方法 質問する

.net コードからストアド プロシージャにテーブル値パラメータを渡す方法 質問する

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;
    }
}

おすすめ記事