2016-10-20 9 views
2

私のデータベースにレコードを挿入するストアドプロシージャがあり、レコードが存在する場合は更新されます。だから私の質問はどのように多くのレコードが更新され、いくつのレコードが挿入されるような結果を得ることができますか? MSDNに基づいasp.netにストアドプロシージャの結果を表示できますか?

// stored procedure 

ALTER PROCEDURE [dbo].[Update_F3_BC_Column_Mapping] 
@tblF3_BC_Column_Mapping F3_BC_Column_MappingType READONLY 
AS 
BEGIN 
SET NOCOUNT ON; 
MERGE INTO F3_BC_Column_Mapping c1 
USING @tblF3_BC_Column_Mapping c2 
ON c1.Id=c2.Id 
WHEN MATCHED THEN 
UPDATE SET c1.Source = c2.Source 
     ,c1.Destination = c2.Destination 
WHEN NOT MATCHED THEN 
INSERT VALUES(c2.Id, c2.Source, c2.Destination); 
END 


//c# code 

connection(); 
{ 
    using (SqlCommand cmd = new SqlCommand("Update_F3_BC_Column_Mapping")) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Connection = con; 
     cmd.Parameters.AddWithValue("@tblF3_BC_Column_Mapping", dtMap); 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 
} 
+1

[UPDATE文によって影響を受ける行の戻り数]の可能な重複(http://stackoverflow.com/questions/1103260/return-number-of-rows-affected-by-update-ステートメント) – Badiparmagi

答えて

3

2つの異なる数、挿入および更新を取得するには、許可するように、ストアドプロシージャを変更することができますいくつかの出力変数を取り、それらをc#のパラメータとして扱います。プロシージャのヘッダーに

、2つの出力パラメータの追加:本体で

ALTER PROCEDURE [dbo].[Update_F3_BC_Column_Mapping] 
@tblF3_BC_Column_Mapping F3_BC_Column_MappingType READONLY, 
@updated_count int output, 
@inserted_count int output 
AS 

を、マージからの出力を保持するテーブル変数を宣言する。

BEGIN 
    SET NOCOUNT ON; 
    declare @outputtable table ([action] nvarchar(10), [count] int); 

そして、このテーブルを埋めるために、マージする(最後)の行を追加します。

MERGE INTO F3_BC_Column_Mapping c1 
    USING @tblF3_BC_Column_Mapping c2 
     ON c1.Id=c2.Id 
    WHEN MATCHED THEN 
     UPDATE SET c1.Source = c2.Source 
       ,c1.Destination = c2.Destination 
    WHEN NOT MATCHED THEN 
     INSERT VALUES(c2.Id, c2.Source, c2.Destination) 
    OUTPUT $action , 1 INTO @outputtable; 

今、あなたはあなたのストアドプロシージャを終了し、この出力テーブル内の行をカウントすることで、あなたの出力変数を移入することができます:

select @updated_count = sum([count]) from @outputtable where [action] = 'UPDATE'; 
    select @inserted_count = sum([count]) from @outputtable where [action] = 'INSERT'; 
END 

(コード行のすべてがこれまでにあなたの新しいストアドプロシージャを構成して掲載。)

connection(); 
{ 
    using (SqlCommand cmd = new SqlCommand("Update_F3_BC_Column_Mapping")) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Connection = con; 
     cmd.Parameters.AddWithValue("@tblF3_BC_Column_Mapping", dtMap); 

     cmd.Parameters.Add("@updated_count", SqlDbType.Int).Direction = ParameterDirection.Output; 
     cmd.Parameters.Add("@inserted_count", SqlDbType.Int).Direction = ParameterDirection.Output; 

そして、あなたはあなたのクエリを実行した後、あなたはvalueプロパティを使用して出力にアクセスすることができます:あなたは今#コードcはあなたに2つの追加のパラメータを追加する必要が

 con.Open(); 
     cmd.ExecuteNonQuery(); 

     int updated = Convert.ToInt32(cmd.Parameters["@updated_count"].Value); 
     int inserted = Convert.ToInt32(cmd.Parameters["@inserted_count"].Value); 

[完了しますあなたのコードオフ:

 con.Close(); 
    } 
} 
2

:UPDATE、INSERTについて

、およびDELETEステートメントは、戻り値はコマンドによって影響を受けた行の数です。挿入または更新される表にトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行数と、トリガーの影響を受ける行数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-1です。ロールバックが発生した場合、戻り値も-1になります。

だから、あなたはこのような変数にExecuteNonQueryの戻り値を格納する必要があります。

int count = cmd.ExecuteNonQuery(); 
関連する問題