【问题标题】:Get data from SQL table throwing null exception even when try block is present即使存在 try 块,从 SQL 表中获取数据也会引发空异常
【发布时间】:2021-03-30 23:35:18
【问题描述】:

在我的 WinForms 应用程序中,我有以下代码,当单击按钮时,它会从 SQL Server 表中获取批号。

private void getlotnumbers()
{
    try
    {
        SqlConnection con = new SqlConnection(cs);
        SqlCommand cmd;
        con.Open();
        string s = "select LotNumber from Lot_Numbers where CoilNumber = @p1";
        cmd = new SqlCommand(s, con);
        cmd.Parameters.AddWithValue("@p1", coilNoTextBox.Text);
        cmd.CommandType = CommandType.Text;
        int i = cmd.ExecuteNonQuery();
        lotNoTextBox.Text = cmd.ExecuteScalar().ToString();
        con.Close();
    }
    catch(Exception ex)
    {
        MessageBox.Show("Lot Number Not Found:" + ex.Message.ToString(), "Lot Number",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }        
}

该函数直到昨天都运行良好,但从今天开始,即使存在 try 块,它也会抛出异常并停止应用程序。

System.NullReferenceException: '对象引用未设置为对象的实例。'

我不知道为什么会这样,但我添加了另一个名为“formedit”的表单来编辑现有记录,这与“FornewEntry”非常相似,但预填充了所选数据网格视图行的值,也许我有在我学习 C# 时,这是第一个应用程序,在做同样的事情时搞砸了 下面是我的解决方案的链接,请帮助我。

【问题讨论】:

  • 那么,您发布的代码甚至不是引发异常的代码吗?我建议您阅读规范的What is a NullReferenceException, and how do I fix it? 问题
  • 嗨..我发布的代码是引发异常的代码,位于lotNoTextBox.Text = cmd.ExecuteScalar().ToString();
  • 所以 lotNoTextbox 为空??你能把断点放在那里并检查你的标签是否有值吗?
  • 是的,它会在表单加载时为空..那是我试图通过从 sql 表中获取批号来用上面的代码填充它,即使有 try 块为什么它会导致我的应用程序崩溃,也可以请下载我的解决方案并在“fornewentry”中单击LotNolinklabel 并建议我有什么问题?
  • "你能下载我的解决方案并点击"没办法,抱歉,没有人会在这里下载源代码并在自己的机器上编译。这不是 SO 的工作方式。您需要在帖子中提供所有必要的信息。因为您的帖子也可以作为未来有类似问题的读者的标志。请调试您的应用程序并告诉我们哪个值是null。是cmd.ExecuteScalar() 的结果吗?或事件你的lotNoTextbox?

标签: c# sql-server visual-studio winforms nullreferenceexception


【解决方案1】:

您正在尝试执行此语句 string s = "select LotNumber from Lot_Numbers where CoilNumber = @p1"; 我认为你的 lotNumber 列值为空,当你 执行 lotNoTextBox.Text = cmd.ExecuteScalar().ToString(); 它会返回 null 所以如果你能处理它

var lotNumber= cmd.ExecuteScalar()==null?"Handle empty case or throw exception with custom message":cmd.ExecuteScalar().ToString();
lotNoTextBox.Text =lotNumber.ToString();

【讨论】:

  • 谢谢你的回答,我已经用try block处理了异常,但是还是退出了整个应用程序,为什么会这样?
  • 因为您的表达式返回 null 值并且您正在执行 null.ToString() 在 null 的情况下 c# 返回错误“对象引用未设置为对象的实例。”
【解决方案2】:

为什么不在 SQL 查询中处理空值?

string s = "select ISNULL(LotNumber, -1) from Lot_Numbers where CoilNumber = @p1";
// returns -1 when LotNumber is not found

【讨论】:

  • 嗨..谢谢你的建议..会尝试同样的。
猜你喜欢
  • 2014-11-09
  • 2017-01-30
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多