从 SQL 表中获取数据,即使存在 try 块,也会引发 null 异常

Get data from SQL table throwing null exception even when try block is present

提问人:RaviKumar 提问时间:12/21/2020 最后编辑:Dale KRaviKumar 更新时间:12/21/2020 访问量:737

问:

在我的 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”非常相似,但是使用所选datagridview行的预填充值,也许我在做同样的事情时搞砸了一些东西,因为这是我正在学习C#的第一个应用程序 以下是我的解决方案的链接,请帮助我。

C# SQL-Server 可视化工作室 WinForms NullReferenceException

评论

0赞 MindSwipe 12/21/2020
那么,您发布的代码甚至不是引发异常的代码吗?我建议您阅读规范的什么是 NullReferenceException,以及如何修复它? 问题
0赞 RaviKumar 12/21/2020
你好。。我发布的代码是抛出异常的代码,在lotNoTextBox.Text = cmd.ExecuteScalar().ToString();
0赞 puko 12/21/2020
所以 lotNoTextbox 是 null ??你能把 breakpooint 放在那里并检查你的标签是否有值吗?
0赞 RaviKumar 12/21/2020
是的,它在表单加载时将是空的。那就是我试图通过从 SQL 表中获取 lotnumber 来使用上述代码来填充它,即使有 try block 为什么它会使我的应用程序崩溃,您能否下载我的解决方案并单击“fornewentry”并建议我出了什么问题?LotNolinklabel
0赞 Mong Zhu 12/21/2020
“你能下载我的解决方案并点击吗”没办法,伙计,对不起,但没有人会在这里下载源代码并在自己的机器上编译它。这不是 SO 的工作方式。您需要在帖子中提供所有必要的信息。因为您的帖子也可以作为未来有类似问题的读者的里程碑。请调试您的应用程序,并告诉我们哪个值是 .是结果吗?或事件你的 ?nullcmd.ExecuteScalar()lotNoTextbox

答:

2赞 Jameel Nazir 12/21/2020 #1

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

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

评论

0赞 RaviKumar 12/21/2020
谢谢你的回答,我已经用try块处理了异常,但还是走出了整个应用程序,为什么会这样?
0赞 Jameel Nazir 12/21/2020
因为您的表达式返回 null 值,并且您正在执行 null。ToString() 在 null 的情况下 c# 返回错误“对象引用未设置为对象的实例”。
2赞 Usama Aziz 12/21/2020 #2

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

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

评论

0赞 RaviKumar 12/21/2020
你好。。谢谢你的建议..会尝试同样的方法。