【问题标题】:SQL Server query not returning any result in asp.netSQL Server 查询未在 asp.net 中返回任何结果
【发布时间】:2016-06-18 23:18:10
【问题描述】:

我试图通过在犯罪数据库中查找他的 NIC 号码来检查一个人是否有过去的犯罪记录。但是查询没有获取任何数据,尽管没有异常并且数据库中存在相关数据,但数据读取器仍然是空的。

请看以下代码:

SqlCommand cmd5 = new SqlCommand("select * from criminal where NIC ="+nic, conn);
string nic = "null";

foreach (var person in allInvolved)
{
    conn.Open();
    nic = person.NIC;

    dr3 = cmd5.ExecuteReader();

    if (dr3.HasRows)
    { do something }
    else if (!dr3.HasRows)
    { do something else}
}

变量 NIC 中的值正确,我在调试时检查了它。我不知道我哪里错了。如果您需要有关代码的任何其他信息,请询问。

提前致谢。

【问题讨论】:

  • 你需要在dr3ExecuteReader之后拨打read
  • 您将 nic 定义为字符串 - 它实际上是一个字符串值还是一个数字,就像您在问题中描述的那样。如果它是字母数字,则必须在 SQL 中将其括在引号中。对不起 - 这就是我能看到的对我来说很突出的全部
  • 你的意思是像if(dr3.Read()) ??如果是,那么我已经尝试过了,但它不起作用。 @muratgu
  • 你说nic里面有正确的值;但是......那个值是什么?因为这是一个字符串,几乎所有可用的值将无法正常工作,因为您既没有引用也没有参数化。
  • 我猜你之前有不止一个 DML 命令?

标签: c# asp.net sql-server


【解决方案1】:

当你这样做时:

 SqlCommand cmd5 = new SqlCommand("select * from criminal where NIC ="+nic, conn);

nic 的当前值在当时使用;将nic 更改为之后 并不重要:

nic = person.NIC;
dr3 = cmd5.ExecuteReader();

因为没有使用那个值。理想情况下,您应该参数化:

SqlCommand cmd5 = new SqlCommand(
    "select * from criminal where NIC = @nic", conn);
var param = cmd5.Paramters.Add("nic", SqlDbType.SomethingRelevant);
// ^^^ note: I don't know what the data type is, you'll need to pick that

foreach(...) {
    param.Value = ((object)person.NIC) ?? DBNull.Value;
    using(var dr3 = cmd5.ExecuteReader()) {
      // ...
    }
}
...

另外,请注意,这些对象中有很多是IDisposable,应该在using 块中;或者,查看“dapper”之类的工具,以便您可以执行以下操作:

var criminals = conn.Query<Criminal>(
    "select * from criminal where NIC = @nic",
    new { nic = person.NIC}).AsList();

【讨论】:

  • 感谢您的回复。当我在查询中调试并将光标移到nic 上时,它会显示当时它应该在查询中具有的正确网卡。你还认为它与你描述的问题相同吗@Marc-Gravell
  • @syed 是的,基本上
  • 我实现了这个解决方案,并在executereaderThe variable name '@nic' has already been declared. Variable names must be unique within a query batch or stored procedure. 上给出了以下异常
  • @SyedHarisAliGhaznavi 啊,对;那么你需要在循环之外声明它;一会儿,将编辑(更新:已编辑)
  • @SyedHarisAliGhaznavi 听起来您正在在循环中添加参数;您需要将其添加到 循环之外。并且:这是错误的数据类型; SqlDbType.NChar 是固定长度的 unicode(nchar sql 类型);但是,varchar 是可变长度的 ANSI。你想要(奇怪的是)SqlDbType.VarChar
【解决方案2】:

试试这个

SqlConnection con = new SqlConnection(connectionString);  
SqlCommand cmd = new SqlCommand();  
cmd.Connection = con;  
con.Open();  

foreach (var person in allInvolved)
{
nic = person.NIC;
cmd.CommandText = "select * from criminal where NIC ="+nic;  
dr3 = cmd.ExecuteReader();

while (dr3.Read())  
{ 
      if (dr3.HasRows)
      { do something}
      else if (!dr3.HasRows)
      { do something else}
}

} con.Close();

【讨论】:

  • 请调试一下。你确定你有数据库中的数据吗? @SyedHarisAliGhaznavi
  • 是的,我对其进行了调试,NIC 变量中有一个值,我在 SQL Studio 中复制并粘贴该值并执行查询,它给出了所需的结果,但在 ASP.NET 中具有相同的参数说datareader是空的@NeerPriv
  • 请检查这个。 stackoverflow.com/questions/5794529/…@SyedHarisAliGhaznavi
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2012-09-11
相关资源
最近更新 更多