winforms 使用linq查询不存在的记录时出现System.NullReferenceException异常

eqoofvh9  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(178)

使用linq查询sql表中不存在的记录时,收到以下错误System.NullReferenceException:'对象引用未设置为对象的示例,但如果.FirstOrDefault()在数据库中找不到任何内容,则不应对其进行处理,是否设置默认值?
我想要做的是,如果数据库中不存在某个记录,则向用户给予一条消息以指明这一点,但如果该记录存在,则希望它提供信息

  • 我创建了一个示例,以免附加所有代码并表达我的失败 *
    我的主窗体代码
namespace Fallas
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void numerofactura_Leave(object sender, EventArgs e)
        {
            var bill = Bill.billfromid (billnumber.Text);
            numerofactura.Text = bill.Numero;
            nombrecliente.Text = bill.Cliente;

        }

我的类代码

namespace Fallas
{

   public class BillModel
    {
        public string Number { get; set; } 
        public string Customer { get; set; }    
        public decimal Subtotal { get; set; }
        public decimal Total { get; set; }  
    }
    public static class Bill
    {
        public static BillModel billfromid(string number) 
    {
        using AppDatabase db = new AppDatabase();
        {
            Bill fct= (from u in db.vta_factura
                                where u.Numero == number
                       select u).FirstOrDefault();
            if (fct.Factura_ID == 0)
            {
                MessageBox.Show("Bill not found!", "Atencion!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return new Bill();
            }
            return fct;
        }

        }
    }
}
ibps3vxo

ibps3vxo1#

从这一行开始:

Bill fct= (from u in db.vta_factura
           where u.Numero == number
           select u).FirstOrDefault();

当行结束时,如果没有匹配的记录存在,fct变量将被设置为null(任何类的默认值,根据“.FirstOrDefault()“的“或默认”部分)。

if (fct.Factura_ID == 0)

您无法查找null变量的Factura_ID属性(或任何其他属性),因此我们会得到NullReferenceException。
您可能希望改为执行以下操作:

if (fct is object)

或者这个:

if (fct != null)
  • is object是现代C#中一种相对较新的检查空值的模式。它被认为是高效的,有助于简化可空/值类型的一些边缘情况的代码,并以积极的方式(没有否定)表达它。*

或者,您也可以只返回此方法的结果,而不进行检查,并让更高级别的调用代码决定最佳的响应方式。这样,此方法在MessageBox不合适的上下文中也会很有用。

vmjh9lq9

vmjh9lq92#

.FirstOrDefault();将返回null(如果未找到记录

相关问题