powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Записать значение null . "Невозможно преобразовать null в int ..."
10 сообщений из 10, страница 1 из 1
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244349
Antony GL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблема.
Программа должна записывать значения в удаленную базу данных, и в принципе, работала до изменений в схеме данных.
Сейчас добавились целочисленное поле (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
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244359
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antony GL,

вместо Null надо передавать DBNull.Value
...
Рейтинг: 0 / 0
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244364
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244369
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.. а расскажите, пожалуйста, зачем надо писать null в базу?
...
Рейтинг: 0 / 0
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244374
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244402
Antony GL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244432
Antony GL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244441
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antony GL,

... это MSSQL? ... если да, то зачем вообще писать null, если для nullable полей сервер сам создает этот null по умолчанию?
...
Рейтинг: 0 / 0
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244468
Antony GL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Записать значение null . "Невозможно преобразовать null в int ..."
    #38244472
Antony GL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

спасибо!

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

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

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

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


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