【问题标题】:EF 5.0 inserting null into smallint columnEF 5.0 将 null 插入 smallint 列
【发布时间】:2012-12-01 19:23:08
【问题描述】:

我有一个 SQL 类型为 smallint(EF 类型为 Int16)的列,我想在其中插入一个 null 值,但是当我使用下面的代码时,我得到一个错误,即 null 不能转换为 short。如果语句允许我插入空值,我怎样才能得到这一行?

CollectionID = (ddlCollection.SelectedValue == "None") ? null  : Convert.ToInt16(ddlCollection.SelectedValue)

【问题讨论】:

  • 标题没有描述正文中的问题。

标签: c# entity-framework-5 asp.net-4.5


【解决方案1】:

工作代码是做一个 nullablecnvert 像:

CollectionID = (ddlCollection.SelectedValue == "None") ? (Nullable<Int16>)null : Convert.ToInt16(ddlCollection.SelectedValue)

【讨论】:

    【解决方案2】:

    c# 在数据库中有一个 null 值: DBNull.Value

    【讨论】:

    • @user1365911 那么你的标题不是根本问题。
    【解决方案3】:

    第一个问题是您的实体框架属性 CollectionID 必须标记为 Nullable(如果您使用 EDMX)或声明为 short?Nullable&lt;short&gt; 如果您使用 Code First。

    其次,您需要确保该列的数据库类型也标记为可为空(类似于 SQL Server 中的smallint NULL)。

    编辑:啊,我想我现在看到了问题所在。尝试将您的电话转至Convert.ToInt16Nullable&lt;short&gt;。三元运算符在true 一侧看到null,在false 一侧输入与null 值不兼容,这会导致您的错误。

    CollectionID = (ddlCollection.SelectedValue == "None")
        ? (Nullable<short>)null 
        : (Nullable<short>)Convert.ToInt16(ddlCollection.SelectedValue)
    

    【讨论】:

    • 在 EF 和 SQL 中,一切都设置为可为空。问题在我打数据库之前就已经发生了。我无法构建,因为 VS2012 抛出了第一篇文章中列出的错误。
    • 您的编辑等同于我当前的代码,错误是在空变量而不是 ddlCollection 上引发的。目标是如果在下拉列表中选择 None 以插入 null,否则插入 selectedvalue。
    • 我再次编辑了我的答案。条件运算符的第一个分支决定了表达式的返回类型,因此必须将 null 强制转换为 Nullable&lt;short&gt; 才能使整个工作正常。
    【解决方案4】:

    与sqlcommand参数一起使用

     if(ddl_collection.selectedvalue!="None")
       command.Parameters.AddWithValue("@CollectionID", Convert.ToInt16(ddlcollection.selectedValue));
    else
        command.Parameters.AddWithValue("@CollectionID", DBNull.Value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2014-10-30
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多