C# SQL Server查询在asp.net中不返回任何结果

C# SQL Server查询在asp.net中不返回任何结果,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我试图通过在犯罪数据库中查找某人的NIC号码来检查他是否有犯罪史。但是查询没有获取任何数据,尽管没有异常,并且数据库中存在相关数据,但数据读取器仍然为空 请参阅以下代码: SqlCommand cmd5 = new SqlCommand("select * from criminal where NIC ="+nic, conn); string nic = "null"; foreach (var person in allInvolved) { conn.Open(); n

我试图通过在犯罪数据库中查找某人的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中有正确的值,我在调试时检查了它。我不知道我哪里做错了。如果您需要有关代码的任何其他信息,请询问

提前谢谢。

试试这个

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()

当您这样做时:

 SqlCommand cmd5 = new SqlCommand("select * from criminal where NIC ="+nic, conn);
此时使用
nic
的当前值;您将
nic
更改为什么并不重要:

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

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()) {
      // ...
    }
}
...
此外,请注意,这些对象中有许多是可识别的,并且应该使用块来识别;或者,看看像“dapper”这样的工具,这样您就可以执行以下操作:

var criminals = conn.Query<Criminal>(
    "select * from criminal where NIC = @nic",
    new { nic = person.NIC}).AsList();
var=conn.Query(
“从其中选择*NIC=@NIC”,
新的{nic=person.nic}).AsList();

您需要在
ExecuteReader
行之后在
dr3
上调用
read
。您将nic定义为字符串-它实际上是一个字符串值还是一个类似于您描述为问题的数字。如果它是字母数字的,则必须在SQL中将其用引号括起来。抱歉-这就是我所能看到的最突出的地方你是说像
if(dr3.Read())
??如果是的话,那么我已经试过了,但它不起作用@muratguYou说
nic
具有正确的价值;但是这个值是多少?由于这是一个字符串,几乎所有可用的值都无法正常工作,因为您既没有引用也没有参数化。我猜在此之前您有多个DML命令?请调试它。您确定数据库中有数据吗@SyedHarisAliGhaznaviYes,我调试了它NIC变量中有一个值我在SQL studio中复制并粘贴了该值并执行了查询,它给出了所需的结果,但在ASP.NET中使用相同的参数,它表示datareader为空@neerpriv请检查此项@谢谢你的回复。当我调试并将光标移到查询中的
nic
上时,它会显示它当时应该在查询中拥有的正确nic。你还认为这和你描述的@Marc一样吗-Gravell@syed是的,Basically实现了这个解决方案,它在
executereader
line
上给出了以下异常,变量名'@nic'已经声明。变量名在查询批处理或存储过程中必须是唯一的。
@SyedHarisAliGhaznavi-ah,对;然后您需要在循环之外声明它;稍等片刻,will edit(update:edited)@SyedHarisAliGhaznavi听起来像是在循环中添加参数;您需要将其添加到循环之外。和:这是错误的数据类型
SqlDbType.NChar
是固定长度的unicode(NCharsql类型)<然而,code>varchar是可变长度的ANSI。您需要(奇怪的是)
SqlDbType.VarChar
var criminals = conn.Query<Criminal>(
    "select * from criminal where NIC = @nic",
    new { nic = person.NIC}).AsList();