空参考例外

时间:2009-01-17 01:21:42

标签: c# .net nullreferenceexception oledbparameter

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

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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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)

查看调试器中的属性值,我们无法对您提供的代码执行任何操作。

答案 3 :(得分:0)

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

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

DAL dal = new DAL(); 

至少强调本地变量或使用其他名称。

DAL _dal = new DAL();
DAL dataAccessLayer = new DAL();