2013-05-14 9 views
7

セッション変数を使用してユーザー入力と一致する次のコードがあります。ストアドプロシージャは、セッション変数のデータがデータベース内のデータと一致する場合、行カウントを返します。ストアドプロシージャを実行し、出力パラメータとSQLパラメータを使用して行カウントをコードに戻す

すべては動作しますが、常に1行になる行数を返します。 一言で言えば、フォームにアクセスして情報を追加し、submitを押します。データはセッションに格納され、ストアドプロシージャは一致したときにデータを返します。

プログラムが動作するにもかかわらずintRecCount変数は常にゼロではなく行数を超えています。

ストアドプロシージャ:出力変数を介して行数を保持する変数次いで...

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 

..:

CREATE PROCEDURE [dbo].[uspConfirmation] 

    @RecordID CHAR(36), 
    @LName VARCHAR(30), 
    @FName VARCHAR(30), 
    @MInit CHAR(1), 
    @RecordCount INT OUTPUT 
AS 

SELECT * FROM Registration 
WHERE RecordID = @RecordID AND 
     LName = @LName AND 
     FName = @FName AND 
     MInit = @MInit 

SET @RecordCount = @@ROWCOUNT 

RETURN 

メソッド/コード。

Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

try { 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
} 
catch (Exception ex) { 
    dbMsg = ex.Message; 
} 
finally { 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 
return ds; 
} 
+1

+1だけでなく、詳細の多くと、質問を考えて良いので、同じように、クエリの実行後、およびパラメータをクリアする前にこの線を移動。ニース。 – Jonathan

+0

ありがとう!私はC#には非常に新しいですが、私はこれを大いに愛し、あなたのような人々から言葉を奨励しています。再度、感謝します! – Asynchronous

答えて

11

以前にクエリを実行した後で出力パラメータの値にアクセスする必要があります。

//VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

だから、メソッドのコードは次のようになります:

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 



SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 
Int32 intRecCount = 0; 
try 
{ 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
    //VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
    intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

} 
catch (Exception ex) 
{ 
    dbMsg = ex.Message; 
} 
finally 
{ 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 


return ds; 
} 
+3

"cmdSQL.Parameters.Clear();"の後にはありません。 tryキャッチの前にInt32 intRecCountを宣言し、クリアの前に代入を行う必要があります。 – Serge

+0

@ Serge、ありがとうございます。 – Habib

+0

ありがとうHabib、Sergeもありがとうございます。私は本当にあなたの助けと知識を感謝します。男! – Asynchronous

関連する問題