【问题标题】:What's the best way to write "nulls" to SQL database when presenting options in combobox?在组合框中显示选项时,将“空值”写入 SQL 数据库的最佳方法是什么?
【发布时间】:2009-02-24 11:10:18
【问题描述】:

我正在编写数据库的前端,将选项显示为组合框。而且我需要能够将空值返回到数据库。

我目前有一个解决方案,它涉及在查询中“伪造”一条记录以填充数据表,然后检测选择并将null 硬编码到我的更新语句中(如果已选择该项目)。

--GetDataByAvailableTechs query 
            SELECT     tblLEMSCredentialsId, TechNumber
            FROM         tblLEMSCredentials AS aLEMSCreds
            UNION ALL
            SELECT     '99999' AS Expr1, '<NONE>' AS Expr2

            //populate combo box
            BV_LEMSHIPDataSet.tblLEMSCredentialsDataTable dtAvailableTechs = taLEMSCreds.GetDataByAvailableTechs(selectedSerial);  
            cboTechNumber.DataSource = dtAvailableTechs;

            //Save back to DB
            if (lemsCredsID == 99999)
            {
                taDevice.UpdateQuery_Restage(null, selectedSerial);
            }
            else
            {
                taDevice.UpdateQuery_Restage(lemsCredsID, selectedSerial);
            }

谁能建议一个更好的方法呢?我需要让应用程序处理另外 5 个类似的字段,并且不想创建多个 if else 版本的更新。

G

【问题讨论】:

    标签: c# sql combobox null tableadapter


    【解决方案1】:

    过去我使用过类似的方法,但对 NULL 值使用负数 - 这样您就可以在一个 if 语句中将任何小于零的值视为 NULL。

    这假设您在表格中的 ID 始终为正数:)

    【讨论】:

      【解决方案2】:

      空对象模式。让它为 UI 返回一个空字符串,并在更新数据库时提供一个方法调用来提取值。在正常情况下,这将返回您的真实值,但 null 对象将覆盖此行为以提供您的 null。

      不需要幻数,您只需在将控件绑定到数据源时将此值添加到“可绑定值”的开头。

      【讨论】:

      • @Quarrelsome:谢谢。您能否进一步解释“当您将控件绑定到数据源时,将此值添加到“可绑定值”的开头”?恐怕我不明白如何实现这一目标
      • 好吧,假设我们有一个组合框,我们将“汽车”绑定到。我们将调用 IList GetCars() 方法来获取所有汽车的数据源,然后在将其绑定到组合框的数据源之前,将我们的“空汽车”添加到此列表(最好在前面)。
      【解决方案3】:

      您可以将一个字符串值作为组合框的“空值”,例如:“thenullvalue”,然后将组合框的值解析为可为空的 int 类型(int?)。对于正确的选择,您将获得所需的值,对于“空选择”,您将获得 null(将“thenullvalue”解析为 int 将为您提供 null):)

      然后将值保存到数据库中:

      int? lemsCredsID = parseInt(combobox.Value);
      
       //Save back to DB
      taDevice.UpdateQuery_Restage(lemsCredsID, selectedSerial);
      

      根据您的数据库提供程序,您可能还需要将可空类型 null 值转换为 DBNull,如下所示:

      taDevice.UpdateQuery_Restage((lemsCredsID==null ? DBNull : (int)lemsCredsID), selectedSerial);
      

      希望这会有所帮助。

      【讨论】:

      • @twk:我看到了这个的逻辑,但它并不完全有效。通过强制转换“int?lemsCredsID = (int?) cboTechNumber.SelectedValue;”我得到了正确的值null,但是参数中的条件运算符“(lemsCredsID == null?DBNull.Value:lemsCredsID)”给出“没有将DBNull显式转换为int”?有什么想法吗?
      • 好的,我明白了。我没有你的 UpdateQuery_Restage 方法,可能它不接受除了 int 作为第一个参数之外的任何东西。您有两种选择:1. 使用另一个接受 System.DBNull 作为第一个参数的方法签名 2. 发送 null,然后在此方法中将其更改为 DBNull
      【解决方案4】:

      如果该值打算为 null,则将 null 传递给数据库将是一个很好的解决方案,这减少了对 null 特殊值的额外逻辑处理,并且可能非常危险和模棱两可。

      视图或应用层应该能够处理从数据库返回或传入数据库的 null。

      例如您可以在绑定控件之前将 null 转换为 string.Empty,也可以在传递到数据库之前将 string.Empty 转换为 null。

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 2015-01-20
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 2012-07-09
        • 1970-01-01
        • 2016-05-19
        相关资源
        最近更新 更多