0

此代码生成空引用异常。异常出现在初始化参数数组的行。可能是什么问题?我不知道如何跟踪堆栈跟踪并对其进行任何逻辑处理。提前致谢。

DAL dal = new DAL();

    string SQL = @"INSERT INTO Assets ([AssetName],[AssetType],[Model],[Description],
                                                          [PurchaseValue],[SalvageValue],[Currency],[DateAcquired,[DateRetire],[ImagePath],
                                                          [InUse])
                                                          VALUES (?,?,?,?,?,?,?,?,?,?,?)";

    OleDbParameter[] par = new OleDbParameter[]{ 
    new OleDbParameter("@assetname",name.Text),
    new OleDbParameter("@assettype",assettypes.SelectedValue.ToString()),
    new OleDbParameter("@model",model.Text),
    new OleDbParameter("@description",description.Text),
    new OleDbParameter("@purchasevalue",purchaseval.Value),
    new OleDbParameter("@salvagevalue",salvageval.Value),
    new OleDbParameter("@currency",currencies.SelectedIndex),
    new OleDbParameter("@dateacquired",purchasedate.Value),
    new OleDbParameter("@dateretire",purchasedate.Value.AddYears((int)lifetime.Value)),
    new OleDbParameter("@imagepath","N/A"),
    new OleDbParameter("@addedby",MDIParent1.User.ID)
    };
4

4 回答 4

6

您可能有一个或多个没有值的可空类型(可能是您的日期?),尽管也可能没有 SelectedValue。在调试器中的语句之前检查所有参数是否非空,以查看哪个。

于 2009-01-17T01:26:53.383 回答
2

您查询的对象之一似乎很可能为空。

我建议将它们打印到标准输出。

于 2009-01-17T01:27:48.483 回答
1

其中一行包含一个空引用:

new OleDbParameter("@assetname",name.Text),
new OleDbParameter("@assettype",assettypes.SelectedValue.ToString()),
new OleDbParameter("@model",model.Text),
new OleDbParameter("@description",description.Text),
new OleDbParameter("@purchasevalue",purchaseval.Value),
new OleDbParameter("@salvagevalue",salvageval.Value),
new OleDbParameter("@currency",currencies.SelectedIndex),
new OleDbParameter("@dateacquired",purchasedate.Value),
new OleDbParameter("@dateretire",purchasedate.Value.AddYears((int)lifetime.Value)),
new OleDbParameter("@imagepath","N/A"),
new OleDbParameter("@addedby",MDIParent1.User.ID)

查看调试器中的属性值,对于您提供的代码,我们真的无能为力。

于 2009-01-17T01:33:27.533 回答
0

实际上,您似乎是直接从用户那里获取输入,而没有先验证或清理它。我的建议(这可能会解决您的 NRE)是在将每个用户输入的值发送到数据库之前对其进行验证。这将允许您在使用错误查询收集数据库之前捕获输入中的任何错误。

请不要将变量命名为与对象相同的名称。我是说

DAL dal = new DAL(); 

至少强调本地变量或使用不同的名称。

DAL _dal = new DAL();
DAL dataAccessLayer = new DAL();
于 2009-01-17T02:01:11.130 回答