0

CSV ファイルからデータを読み取り、データ テーブルにデータを入れています。この dt をストアド プロシージャに送信して挿入/更新しています。以下は私のストアドプロシージャです:

*======================================

ALTER  PROC [dbo].[ups_InsertTVPOrderHeaders]
(
   @tvp [dbo].[TYPOrderHeaders] READONLY
)
AS
    SET NOCOUNT ON;
    DECLARE @InsertOutput TABLE
    (
      MergeAction VARCHAR(20),
      OrderHeaderID int

    );
  BEGIN TRY

  MERGE INTO dbo.OrderHeaders AS T
    USING @tvp AS S
    ON T.OrderHeaderID = S.OrderHeaderID
    WHEN MATCHED THEN 
                  UPDATE SET T.CustomerID = S.CustomerID,
                                 T.FirstName = S.FirstName,
                                 T.LastName = S.LastName

    WHEN NOT MATCHED THEN 
                     INSERT (OrderHeaderID,CustomerID,FirstName,LastName) 
                     VALUES (S.OrderHeaderID,S.CustomerID,S.FirstName,S.LastName)
        OUTPUT $action, inserted.OrderHeaderID INTO @InsertOutput;
        --OUTPUT $action, inserted.OrderHeaderID, Deleted.OrderHeaderID;
        --OUTPUT $action, DELETED.*, INSERTED.*;

      COMMIT TRANSACTION

SELECT * FROM @InsertOutput;        

  END TRY

  BEGIN CATCH

  END CATCH 

*================================================ ==================

C# コード呼び出し SP 部分

  using (SqlConnection con = new SqlConnection(_conStr))
            {
                con.Open();
                using(SqlCommand cmd = new SqlCommand(procedureName, con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter param = cmd.Parameters.AddWithValue("@tvp", SqlDbType.Structured);
                    param.Value = dt;
                    int result = cmd.ExecuteNonQuery();
                    return result;
                }
            }

================================================== ================================ 私は結果を 0 として取得しています。spから出力句を取り出した場合。その作品はうまくいきます。ステートメントへの出力で何が問題なのか教えてください。orderheaderID の挿入/更新リストが必要でした。したがって、出力句を使用してみました。

4

1 に答える 1

2

cmd.ExecuteNonQuery();結果を返さず、影響を受ける行数のみを使用しています。MSDN によると、これは ExecuteNonQuery の機能です。

接続に対して Transact-SQL ステートメントを実行し、影響を受けた行の数を返します。

おそらくExecuteReaderを使いたいでしょう:

using (SqlConnection con = new SqlConnection(_conStr))
{
    con.Open();
    using(SqlCommand cmd = new SqlCommand(procedureName, con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter param = cmd.Parameters.AddWithValue("@tvp", SqlDbType.Structured);
        param.Value = dt;
        using (var reader = cmd.ExecuteReader())
        {
            int result = 0;

            while (reader.Read())
            {
                // Do something with the reader, then increment result by 1 to get total rows affected
                result++;
            }
        }
        return result;
    }
}
于 2013-09-02T08:21:12.797 に答える