web-dev-qa-db-ja.com

ストアドプロシージャにデータテーブルを渡す

C#で作成されたデータテーブルがあります。

using (DataTable dt = new DataTable())
{
    dt.Columns.Add("MetricId", typeof(int));
    dt.Columns.Add("Descr", typeof(string));
    dt.Columns.Add("EntryDE", typeof(int));
    foreach (DataGridViewRow row in dgv.Rows)
    {
        dt.Rows.Add(row.Cells[1].Value, row.Cells[2].Value, row.Cells[0].Value);
    }

    // TODO: pass dt
}

そして、私はストアドプロシージャを持っています

CREATE PROCEDURE [dbo].[Admin_Fill] 
-- Add the parameters for the stored procedure here
@MetricId INT,
@Descr VARCHAR(100),
@EntryDE VARCHAR(20)

このストアドプロシージャにデータテーブルを渡す方法は何ですか。

14
user1108948

SQL Server 2008/.NET 3.5以降では、テーブル値パラメーターを使用できます。

チェックアウト MSDNのガイド

また、利用可能な他のオプションがあるため、複数の値(単一フィールド)をsprocに渡す3つのアプローチを比較しています( TVP vs XML vs CSV )。

17
AdaTheDev
  1. 渡すテーブルタイプをデータベースに定義する必要がありますユーザー定義のテーブルタイプ

  2. 次に、次のように渡すために、ストアドプロシージャにパラメーターを追加する必要があります。

    @YourCustomTable AS [dbo].YourCustomTable Readonly,
    
  3. 次に、行を設定したら、次のように呼び出します。

    // Setup SP and Parameters
    command.CommandText = "YOUR STORED PROC NAME";
    command.Parameters.Clear();
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@someIdForParameter", someId);
    command.Parameters.AddWithValue("@YourCustomTable",dtCustomerFields).SqlDbType = SqlDbType.Structured;
    
    //Execute
    command.ExecuteNonQuery();
    

これで問題が解決します

9
Tabish Sarwar