0

私は次のコードを持っています:

SqlCommand cmd2 = new SqlCommand(
  "SELECT ClaimId FROM tblPayment WHERE PaymentId = " + PaymentID.ToString(),
  mvarDBConn);
SqlDataReader reader = cmd2.ExecuteReader();
reader.Read();
Int32 ClaimId = reader.GetInt32(0);
reader.Close();

SQLでSELECTステートメントを実行すると、数値は正常に返されますが、ExecuteReaderを使用すると、返されるのは0だけです。ExecuteScalar、ExecuteNonQuery、reader.GetStringなどの複数のメソッドを試し、それをintにキャストしました。

私は何が欠けていますか?ありがとう。

編集:SQLServerプロファイルで取得するものは次のとおりです。

これが私が返すものです:

 exec sp_executesql N'SELECT ClaimId FROM tblPayment WHERE PaymentId = @paymentID',N'@paymentID nvarchar(5)',@paymentID=N'8392'

私が持っていた前のSqlCommandが「N」と同じようにSQLに直接移動するときに、なぜそれがSP_ExecuteSQLに入れられるのかわかりません。

4

3 に答える 3

10

これに使用する方が良いSqlCommand.ExecuteScalar()です:

int ClaimId = Convert.ToInt32(cmd2.ExecuteScalar());

また、 SQLインジェクション攻撃の可能性を回避するには、次のパラメータを指定してADOコマンドオブジェクトを使用します。

// create command
SqlCommand cmd2 = new SqlCommand(
  "SELECT ClaimId FROM tblPayment WHERE PaymentId = @paymentID",
  mvarDBConn);

// add parameter
cmd2.Parameters.AddWithValue("@paymentID", PaymentID);

// execute command and convert the result
int ClaimId = Convert.ToInt32(cmd2.ExecuteScalar());
于 2012-09-05T15:36:21.490 に答える
3

あなたはで試すことができます

 new SqlCommand("SELECT ClaimId FROM tblPayment WHERE PaymentId = @param"); 

 cmd2.Parameters.AddWithValue("@param", PaymentID);
于 2012-09-05T15:41:03.213 に答える
0

読み取りでwhileループを実行してみてください。

while (reader.Read())
{
    Int32 ClaimId = reader.GetInt32(0);
}

ただし、whileの外でClaimId変数を宣言することもできます。

于 2015-06-16T14:26:02.133 に答える