如何通过 C# 将可空整数列的空值插入 SQL 表

Posted

技术标签:

【中文标题】如何通过 C# 将可空整数列的空值插入 SQL 表【英文标题】:How to Insert null value for a nullable integer column to SQL Table by C# 【发布时间】:2019-01-17 22:02:50 【问题描述】:

我正在通过 OleDBConnection 读取 CSV 文件,检索那里某些字段的整数值并保存到 SQL DB。我有一个名为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 为空时,这意味着 CSV 中的一行没有 Q3 的数据,它给出了错误:

过程或函数“spInsert_Data”需要参数“@Q3”,它 未提供。

错误的图片在下面。出了什么问题,我该如何解决?任何帮助将不胜感激!

【问题讨论】:

Stored procedure or function expects parameter which is not supplied的可能重复 【参考方案1】:

你可以使用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 可用于在数据库中设置空值。来自docs:

如果数据库字段缺少数据,您可以使用 DBNull.Value 属性来显式地为字段分配一个 DBNull 对象值。

【讨论】:

if (drpselected.SelectedValue == "") values.add(DBNull.Value); else values.add(drpselected.SelectedValue); 【参考方案2】:

只需将其设置为 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

【讨论】:

原来还有其他列,所以即使 Q3 为空,我也应该添加该行。我会试试你的解决方案 您的解决方案有效,只是我不想更新 SP,因为它也被其他页面使用。非常感谢分享这个,感激不尽。 没有汗水! @ErayBalkanli

以上是关于如何通过 C# 将可空整数列的空值插入 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

SQL触发器用INSERT上的当前日期替换表中的空值?

可空引用类型意外 CS8629 可空值类型可能为带有临时变量的空

可空类型的 datagridview 组合框下拉列表中的空值

如何定义一个维度,以便在显示所有值时不忽略 FK 中的空值?

Kotlin空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

用于检查整个表的空值的 Bigquery SQL 函数