Исключение нулевой ссылки

Этот код генерирует исключение 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)
    };

person Community    schedule 17.01.2009    source источник


Ответы (4)


Вероятно, у вас есть один или несколько типов, допускающих значение NULL (возможно, ваши даты?), которые не имеют значений, хотя также может быть и так, что SelectedValue отсутствует. Убедитесь, что все ваши параметры не равны нулю перед оператором в отладчике, чтобы увидеть, какие именно.

person tvanfosson    schedule 17.01.2009
comment
Хороший звонок. Объединение в моем ответе: если вы поместите каждый из них в одну строку (не внутри {}), вы получите более полезную трассировку стека. Или метод отладчика, тоже хорошо работает. - person Michael Haren; 17.01.2009
comment
Я думаю, что значения параметров поступают из элементов управления, и наиболее вероятным виновником является SelectedValue в типах активов. - person Andrew Kennan; 17.01.2009

Скорее всего, один из запрашиваемых вами объектов имеет значение null.

Я предлагаю распечатать их на стандартный вывод.

person Owen    schedule 17.01.2009

Одна из этих строк содержит нулевую ссылку:

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)

Посмотрите на значения свойств в отладчике, мы ничего не можем сделать с предоставленным вами кодом.

person Ed S.    schedule 17.01.2009

На самом деле похоже, что вы принимаете ввод непосредственно от пользователя без предварительной проверки или очистки. Мой совет, который, вероятно, решит ваш NRE, заключается в проверке каждого введенного пользователем значения перед его отправкой в ​​базу данных. Это позволит вам отловить любые ошибки ввода до того, как вы загрузите БД неверным запросом.

И, пожалуйста, не называйте переменные так же, как объекты. Я имею в виду

DAL dal = new DAL(); 

по крайней мере, подчеркните локальные переменные или используйте другое имя.

DAL _dal = new DAL();
DAL dataAccessLayer = new DAL();
person StingyJack    schedule 17.01.2009