【问题标题】:SELECT statement using C#使用 C# 的 SELECT 语句
【发布时间】:2012-09-05 15:34:26
【问题描述】:

我有以下代码:

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”相同。

【问题讨论】:

  • ClaimId的数据类型是什么?
  • 连接“mvarDBConn”是否打开?
  • 警告您的代码可能容易受到 sql 注入攻击!
  • 你确定PaymentID 真的包含正确的值吗?
  • 当你在mysql中运行查询时,返回结果?

标签: c# .net sql-server ado.net


【解决方案1】:

最好使用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());

【讨论】:

  • 不走运,它仍然为 ClaimId 返回 0。不过,感谢您提供有关防止 SQL 注入的提示。
  • @Feren6 - 您是否尝试过代码之外的查询?我怀疑Convert.ToInt() 会将null 结果转换为0(零) - 你确定你有一个ClaimId 用于你正在测试的PaymentId跨度>
  • ToInt 不是 Convert 的函数,只有 Int16、Int32 和 Int64 作为选项。
  • @Feren6:“ToInt 不是 Convert 的函数” - 啊,是的!那应该是Convert.ToInt32() - 我已经更新了答案
  • @Feren6 - 此时,我会打开SQL Server Profiler 以查看究竟是什么发送到数据库并由数据库执行,然后我会从 Profiler 复制该查询并粘贴它进入 SQL Management Studio 以查看数据库返回的内容
【解决方案2】:

你可以试试

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

 cmd2.Parameters.AddWithValue("@param", PaymentID);

【讨论】:

    【解决方案3】:

    尝试在读取时运行 while 循环。

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

    不过,您可能希望在 while 之外声明 ClaimId 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2013-10-13
      相关资源
      最近更新 更多