1

私がこの方法を持っているとしましょう

public static void LockPerformanceToDB(List<performance> listOfPerformances)
{
    //Do I need just to wrap this call with a loop? ... 
    using(var con = new OpenConnection)
    {
       //I call the LockPerformanceToDB SPROC here ...
    }
}

データベースには次の手順もあります。

CREATE PROCEDURE LockPerformancesToDB
    @UserId INT,
    @Comments VARCHAR(50),
    @TimeStamp DATETIME
AS
BEGIN
    INSERT INTO Performance
    (UserId, Comments, [TimeStamp])
    VALUES
    (@UserId, @Comments, @TimeStamp)
END

この sproc は一度に 1 つの挿入を処理します。リストに同じパフォーマンス オブジェクトがいくつかあることは明らかです。リストの各オブジェクトをループすることは解決策ですか?

lisOfPerformances にオブジェクトがあるのと同じ回数ループして sproc を呼び出す以外に、別の解決策があるかどうかを知りたいですか?

助けてくれてありがとう

4

1 に答える 1

0

テーブル値パラメーターを使用して複数の行をストアド プロシージャに渡さない理由はありません。

テーブル値パラメーターは、ユーザー定義のテーブル型を使用して宣言されます。テーブル値パラメーターを使用すると、一時テーブルや多数のパラメーターを作成することなく、複数行のデータを Transact-SQL ステートメントまたはルーチン (ストアド プロシージャや関数など) に送信できます。

  1. タイプを作成する

    Create Type TVP_LockPerformancesToDB As Table(
     UserId int, Comments varchar(50), [TimeStamp] datetime)
    
  2. ストアド プロシージャを次のように作成します。

    CREATE PROCEDURE LockPerformancesToDB2
    @CommentInfo TVP_LockPerformancesToDB READONLY
    AS
    BEGIN
      INSERT INTO Performance
       (UserId, Comments, [TimeStamp])
        SELECT UserId, Comments, [TimeStamp]
      FROM @CommentInfo
    END
    
  3. 次に、コードで

    class Performance
    {
        public int UserId { get; set; }
        public string Comments { get; set; }
        public DateTime TimeStamp { get; set; }
    }
    
    
    
    List<Performance> listOfPerformances = new List<Performance>() {
         new Performance{ UserId=1, Comments="First", TimeStamp=DateTime.Now},
         new Performance{ UserId=2, Comments="Second", TimeStamp=DateTime.Now},
         new Performance{ UserId=3, Comments="Third", TimeStamp=DateTime.Now}
     };
    
    
     SqlCommand cmd = new SqlCommand();
     var dt = new DataTable();
     dt.Columns.Add("UserId", typeof(Int32));
     dt.Columns.Add("Comments", typeof(string));
     dt.Columns.Add("TimeStamp", typeof(DateTime));
     for (int i = 0; i < listOfPerformances.Count; i++)
     {
        dt.Rows.Add(listOfPerformances[i].UserId, listOfPerformances[i].Comments, listOfPerformances[i].TimeStamp);
     }
    
     cmd.Connection = conn;
     cmd.CommandText = "LockPerformancesToDB2";
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Parameters.Add(new SqlParameter("CommentInfo", SqlDbType.Structured));
     cmd.Parameters["CommentInfo"].Value = dt;
    
     cmd.ExecuteNonQuery();
    
于 2013-11-05T19:11:19.683 に答える