C# ADO SqlReader在读取()后失败=true:在不存在数据的情况下尝试读取无效

C# ADO SqlReader在读取()后失败=true:在不存在数据的情况下尝试读取无效,c#,ado.net,sqldatareader,C#,Ado.net,Sqldatareader,我有以下代码(在回答了一些问题后进行了修改): 据我所知,它不应该失败,因为我正在重复检查结果,首先是“HasRows”,然后是if“Read()”。 现在,虽然代码可以工作,但我比以前更困惑,因为它使用相同的值开始工作 谁能告诉我为什么 提前感谢。请使用列idx或列名尝试invoiceResult.GetString()。确切的错误消息是什么?invoiceResult[“invoice_pk”]null吗?请注意,在SQL中附加字符串(特别是文本框中的值)会使您容易受到SQL注入的影响。考虑

我有以下代码(在回答了一些问题后进行了修改):

据我所知,它不应该失败,因为我正在重复检查结果,首先是“HasRows”,然后是if“Read()”。 现在,虽然代码可以工作,但我比以前更困惑,因为它使用相同的值开始工作

谁能告诉我为什么


提前感谢。

请使用列idx或列名尝试invoiceResult.GetString()。

确切的错误消息是什么?
invoiceResult[“invoice_pk”]
null吗?请注意,在SQL中附加字符串(特别是文本框中的值)会使您容易受到SQL注入的影响。考虑切换到参数不变。非常感谢您的答复。我的错误是:当没有数据出现时,消息=无效的读取尝试。还考虑在<代码>中使用< <代码> >语句(真的把所有的代码> IDISPOSTABLE < /代码> s)放入GRIN中,尝试<代码> Cuffice PK=CuffiCeReSurt。GetValue(0).toStReg();<代码>@juharr:谢谢你的建议。我现在正在做。
  String sql = "SELECT invoice_pk FROM invoices WHERE invoice_number = " + InvoiceNumberLabel.Text;
  SqlCommand cmd = new SqlCommand(sql, invoiceHeaderOnOSDconn);
  SqlDataReader invoiceResult = cmd.ExecuteReader();
  if (invoiceResult.HasRows)
  {
     if (invoiceResult.Read())
     {  // As Rahul suggested (even though the post is now deleted) I added this third check and it worked
        if (invoiceResult["invoice_pk"] != DBNull.Value)
        { 
           String invoice_pk = invoiceResult["invoice_pk"].ToString();
        }
     }
     invoiceResult.Close();
  }