How to pass table value parameters to stored procedure from .net code

后端 未结 5 2147
难免孤独
难免孤独 2020-11-22 00:35

I have a SQL Server 2005 database. In a few procedures I have table parameters that I pass to a stored proc as an nvarchar (separated by commas) and internally

5条回答
  •  一整个雨季
    2020-11-22 00:53

    DataTable, DbDataReader, or IEnumerable objects can be used to populate a table-valued parameter per the MSDN article Table-Valued Parameters in SQL Server 2008 (ADO.NET).

    The following example illustrates using either a DataTable or an IEnumerable:

    SQL Code:

    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# Code:

    private static void ExecuteProcedure(bool useDataTable, 
                                         string connectionString, 
                                         IEnumerable 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 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 CreateSqlDataRecords(IEnumerable 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;
        }
    }
    

提交回复
热议问题