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 等。

我错过了什么?谢谢。

编辑:这是我在 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”相同。

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 回答