我有以下代码:
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,等等
我错过了什么?感谢。
编辑:这是我在SQL Server配置文件中得到的:
以下是我的回复:
exec sp_executesql N'SELECT ClaimId FROM tblPayment WHERE PaymentId = @paymentID',N'@paymentID nvarchar(5)',@paymentID=N'8392'
当我之前的SqlCommand直接使用SQL时,不知道为什么它将它放入SP_ExecuteSQL中,与'N'相同。
答案 0 :(得分:9)
最好使用SqlCommand.ExecuteScalar()
:
int ClaimId = Convert.ToInt32(cmd2.ExecuteScalar());
另外,为避免可能的SQL Injection attack,请使用带参数的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());
答案 1 :(得分:3)
您可以尝试使用
new SqlCommand("SELECT ClaimId FROM tblPayment WHERE PaymentId = @param");
和
cmd2.Parameters.AddWithValue("@param", PaymentID);
答案 2 :(得分:0)
尝试在读取时运行while循环。
while (reader.Read())
{
Int32 ClaimId = reader.GetInt32(0);
}
尽管如此,您可能希望在while之外声明ClaimId变量。