sql >> データベース >  >> RDS >> Sqlserver

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

    DataTableDbDataReader 、またはIEnumerable<SqlDataRecord> オブジェクトを使用して、MSDNの記事「SQLServer 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;
        }
    }
    


    1. MySQLユーザーパスワードの変更

    2. Djangoで同等のGROUP_CONCAT

    3. PostgreSQLWhereカウント条件

    4. pg-v0.17.1のインストール