Как вставить нулевое значение для столбца с целочисленным значением NULL в таблицу SQL с помощью C # - PullRequest
0 голосов
/ 18 января 2019

Я читаю CSV-файл через OleDBConnection, получаю целочисленные значения для некоторых полей и сохраняю в БД SQL. У меня есть столбец с именем Q3, который обнуляется .

Когда я пытаюсь сделать следующее, это работает хорошо:

create table #temp (num int);
insert into #temp (num) values (null);

Однако у меня есть следующий код в asp.net 4.5, который не работает:

SQLDatabase sql = new SQLDatabase();
SQLParamList sqlParams = new SQLParamList();

int? Q3 = null;
Q3 = CheckNumericContent(r, dr, "Q3"); //Q3 empty cell for the row in csv.
sqlParams.Add("@Q3", Q3); //Q3 is still null here.
sql.ExecStoredProcedureDataTable("[spInsert_Data]", sqlParams);

Код функции CheckNumericContent здесь:

private int? CheckNumericContent(int r, DataRow dr, string columnname)
{
    int ret = -1;
    if (dr[columnname] != null && !String.IsNullOrEmpty(dr[columnname].ToString()))
    {
        try
         {
             if (!Int32.TryParse(dr[columnname].ToString(), out ret))
             {
                 ErrorMessage = ErrorMessage + string.Format("Row {0}: {1) is not numeric.\n", r.ToString(), columnname);
             }
         }
         catch (Exception ex)
         {
            ErrorMessage = ErrorMessage + "some error: "+ex.ToString(); 
         }
          return ret;
    }
    else
    {
        return null;
    }          
}

хранимая процедура spInsert_Data: (Sql Server 2014):

CREATE PROCEDURE spInsert_Data
   @Q3 int
AS BEGIN
   insert into tblMyData (Q3) values (@Q3);
END

Этот код работает хорошо, если Q3 не равен нулю. Когда Q3 равен нулю, что означает, что для строки Q3 нет данных для строки в CSV, он выдает ошибку:

Процедура или функция 'spInsert_Data' ожидает параметр '@ Q3', который не был поставлен.

Изображение ошибки приведено ниже. Что не так и как я могу это исправить? Любая помощь будет оценена!

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете использовать DBNull.Value.

int? Q3 = null;
Q3 = CheckNumericContent(r, dr, "Q3"); //Q3 empty cell for the row in csv.
if (Q3.HasValue)
{
    sqlParams.Add("@Q3", Q3);
}
else
{
    sqlParams.Add("@Q3", DBNull.Value)
}
sql.ExecStoredProcedureDataTable("[spInsert_Data]", sqlParams);

DBNull.Value может использоваться для установки нулевого значения в базе данных. Из документов :

Если в поле базы данных отсутствуют данные, вы можете использовать DBNull.Value свойство явно присваивать полю значение объекта DBNull.

0 голосов
/ 18 января 2019

Просто установите его в null как значение по умолчанию.Но вы захотите вставить , а не , когда это значение равно нулю (по крайней мере, это то, что я ожидал) ... поэтому добавьте IF.

CREATE PROCEDURE spInsert_Data (@Q3 int = null)
AS BEGIN
IF (@Q3 is not null)
BEGIN
   insert into tblMyData (Q3) values (@Q3);
END
END
...