Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Записать значение null . "Невозможно преобразовать null в int ..." / 10 сообщений из 10, страница 1 из 1
29.04.2013, 18:35
    #38244349
Antony GL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
Возникла проблема.
Программа должна записывать значения в удаленную базу данных, и в принципе, работала до изменений в схеме данных.
Сейчас добавились целочисленное поле (int), nullable.
По умолчанию нужно сделать запись null в значение этого атрибута.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  public int EventRecordId;
        public string DomainWorkGroup;
        public string Machine;
        public DateTime DateTime;
        public int EventType;
        public long EventId;
        public string UserName;
        public string LogonId;
        public int WorkerID;

 cmd.CommandType = CommandType.Text;
                cmd.CommandText = "INSERT INTO [eventtime]([Machine],[DateTime],[EventType],[EventID],[Username], [WorkerID])"
                                  + " VALUES (@Machine,@DateTime,@EventType,@EventID,@Username,@WorkerID)";
              

                //cmd.Parameters.AddWithValue("@DomainWorkGroup", aEntry.DomainWorkGroup ?? "-");
                cmd.Parameters.AddWithValue("@Machine", aEntry.Machine ?? "-");
                cmd.Parameters.AddWithValue("@DateTime", aEntry.DateTime);
                cmd.Parameters.AddWithValue("@EventType", aEntry.EventType);
                cmd.Parameters.AddWithValue("@EventID", aEntry.EventId);
                cmd.Parameters.AddWithValue("@Username", aEntry.UserName ?? "-");
                cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID=null);

cmd.ExecuteNonQuery();



и вот тут начинаются проблемы.
"невозможно преобразовать null в "int", т.к. он является типом значения, не допускающим null"

пробовал варианты

cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID ? null);
cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID ? "null");

почему-то ругается на отсутствующее двоеточие в конце.

также пробовал

public int? WorkerID = null;

компилируется успешно, все вроде хорошо,
но потом база данных при работе с приложением возвращает
expects parameter @WorkerID, which was not supplied.
...
Рейтинг: 0 / 0
29.04.2013, 18:48
    #38244359
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
Antony GL,

вместо Null надо передавать DBNull.Value
...
Рейтинг: 0 / 0
29.04.2013, 18:51
    #38244364
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
Antony GL, кто писал приведённый Вами код?

Добавьте проверку на null, фигли:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
if (aEntry.WorkerID == null)
{
    cmd.Parameters.AddWithValue("@WorkerID", DBNull.Value);
}
else
{
    cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID.Value;
}
...
Рейтинг: 0 / 0
29.04.2013, 18:53
    #38244369
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
.. а расскажите, пожалуйста, зачем надо писать null в базу?
...
Рейтинг: 0 / 0
29.04.2013, 18:56
    #38244374
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
...
Рейтинг: 0 / 0
29.04.2013, 19:11
    #38244402
Antony GL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
LelouchAntony GL,

вместо Null надо передавать DBNull.Value

Нашел http://msdn.microsoft.com/ru-ru/library/system.dbnull.value(v=vs.90).aspx статью, но у меня не получается корректно вызвать это дело - упираюсь в старую ошибку на новый лад:

Код: c#
1.
2.
public int WorkerID;
cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID=DBNull.Value);



Оператор = не может применяться к операндам типа int и System.DBNull

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

Попробовал объявить в переменной
Код: c#
1.
public int WorkerID = DBNull.Value;


пишет неявное преобразование невозможно

Попробовал другой прием:

Код: c#
1.
2.
public int WorkerID=-1;
cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID);



Компилируется, ошибок не выдает, записей в базу не делает, try catch ничего не отлавливает. Завершается без ошибок и каких-либо полезных записей в логах.
...
Рейтинг: 0 / 0
29.04.2013, 19:50
    #38244432
Antony GL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
skyANAAntony GL, кто писал приведённый Вами код?

Добавьте проверку на null, фигли:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
if (aEntry.WorkerID == null)
{
    cmd.Parameters.AddWithValue("@WorkerID", DBNull.Value);
}
else
{
    cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID.Value;
}



Достался по наследству.

carrotik.. а расскажите, пожалуйста, зачем надо писать null в базу?

вообще-то, WorkerID - FK, как бы грустно и смешно не звучало.
Но поскольку сервис, который делает запись в БД, WorkerID знать не может, то он пишет туда null , а другая программа, перед работой с базой данных, выполняет апдейт, который наполняет столбец значениями...
...
Рейтинг: 0 / 0
29.04.2013, 20:09
    #38244441
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
Antony GL,

... это MSSQL? ... если да, то зачем вообще писать null, если для nullable полей сервер сам создает этот null по умолчанию?
...
Рейтинг: 0 / 0
29.04.2013, 20:59
    #38244468
Antony GL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
carrotikAntony GL,

... это MSSQL? ... если да, то зачем вообще писать null, если для nullable полей сервер сам создает этот null по умолчанию?

Да, СУБД - MS SQL 2005 и 2008.
Ответ на ваш вопрос в первом посте:

Antony GLВозникла проблема.

public int? WorkerID = null;

компилируется успешно, все вроде хорошо,
но потом база данных при работе с приложением возвращает
expects parameter @WorkerID, which was not supplied.

а также, в случае, если последнее поле в программе не описано вообще никак, то возвращает ошибку "There are more columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement"
...
Рейтинг: 0 / 0
29.04.2013, 21:03
    #38244472
Antony GL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Записать значение null . "Невозможно преобразовать null в int ..."
skyANA,

спасибо!

Рабочий вариант следующий

Объявление переменной:
public int? WorkerID=null;

if (aEntry.WorkerID == null)
{
cmd.Parameters.AddWithValue("@WorkerID", DBNull.Value);
}
else
{
cmd.Parameters.AddWithValue("@WorkerID", aEntry.WorkerID);
}

Спасибо еще раз.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Записать значение null . "Невозможно преобразовать null в int ..." / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]