【问题标题】:Are nullable types perfect for my situation?可空类型是否适合我的情况?
【发布时间】:2010-12-09 06:17:54
【问题描述】:

最近将我的 ASP.NET 项目从 1.1 转换为 3.5。万岁!目前正在开发一个包含一些可选字段的表单。通常,我会在我的代码中进行检查,添加大量 if 语句,检查是否有空字段,如果是,则将 value 设置为 0。所以,我想知道是否最好为这些字段中的每一个声明私有的、可为空的变量,然后将它们添加为我的数据库更新的参数?使用 MSSQLS 2000,已经将相应的字段设置为允许空值。

澄清一下:网络表单包含美元金额字段。输入的默认值为 0,但如果用户删除其中一个 0,将该字段留空然后提交表单,则会在该方法的参数列表中的 Convert.ToDecimal(MoneyField.Text) 处引发异常将所有这些提交到数据库。有没有我想念的更清洁的方法来做到这一点?

【问题讨论】:

    标签: c# asp.net sql-server-2000


    【解决方案1】:

    您会有许多真正可以为空的字段似乎很不寻常,但是如果您需要将“无值”单独描述为(例如)int,然后是:Nullable<T> 可能会有所帮助。请注意,您必须在数据层手动将null 转换为DbNull.Value,因为SqlParameter 上的null 表示“不发送此参数”,“发送值null"(如果您看到区别)。

    【讨论】:

    • 不知道是不是那么多;表单有 21 个字段,其中 9 个是可选的,美元金额。所以,作为一个论点,我正在尝试:Convert.ToDecimal(MoneyField.Text)。现在,如果没有在该字段中输入任何内容,则转换失败。所以我试图找到最简洁的方法来允许该参数为空,这样我就可以将该空传递给数据库。
    • 在输入的文件上构建所需的插入文件。建立一个要插入的字段列表,然后忘记休息。
    • 我还没有处理过列表,所以我得做一些阅读,看看这是否是一个可行的选择。
    【解决方案2】:

    我认为这里的字段验证和可空类型之间存在混淆...除非您当然有某种类型...比如说DateTime 并希望它为空...这是不可能的除非使用可空类型。

    如果是这种情况,那么......是的..Nullable 类型是解决方案。

    【讨论】:

      【解决方案3】:

      是的,听起来像是一个计划。

      不过,您必须更改几个调用

      static class NConv
      {
          static T? ToNullable<T>(string str) where T : struct
          {
              return (T?)(string.IsNullOrEmpty(str) ? default(T?) : Convert.ChangeType(str, typeof(T)));
          }
      
          static void HowTo()
          {
              double? myBonus = NConv.ToNullable<double>(null);
          }
      }
      

      【讨论】:

        【解决方案4】:

        根据提供的字段动态构建您的 sql。

        【讨论】:

          猜你喜欢
          • 2015-02-01
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多