2009-02-24 15 views
0

我正在写数据库的前端,将选项显示为组合框。我需要能够将空值返回到数据库。在组合框中显示选项时,写入“nulls”到SQL数据库的最佳方式是什么?

我现在有一个解决方案,它涉及到'查询'记录到查询中以填充数据表,然后检测选择和硬编码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个类似的领域,并且不希望创建更多的其他版本。

回答

3

在过去,我已经使用了类似的方法,但用于NULL值减去的数字 - 你可以在你的if语句对待任何小于零为NULL的一个方式。

这里假设你的ID在该表始终为正,虽然:)

1

你可以将一个字符串值作为组合框“空值”,例如:“thenullvalue”然后解析组合框的值可空整型(INT?)。为了正确的选择,你会得到期望的价值,为“空选”,你会得到空(解析“thenullvalue”为int会给你NULL):)

然后值数据库保存,就像:

int? lemsCredsID = parseInt(combobox.Value); 

//Save back to DB 
taDevice.UpdateQuery_Restage(lemsCredsID, selectedSerial); 

根据您的DB提供程序,你可能还需要可空类型的空值转换为DBNull的,就像这样:

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

希望这有助于。

+0

@twk:我看到了这个逻辑,但它不是很有效。通过铸造“int?lemsCredsID =(int?)cboTechNumber。SelectedValue;“我得到正确的值为null,但args中的条件运算符”(lemsCredsID == null?DBNull.Value:lemsCredsID)“给出”没有明确的转换DBNull到int“?任何想法? – 2009-02-24 14:32:46

+0

好吧,我明白了。 你有两个选择: 1.使用另一个接受System.DBNull作为第一个参数的方法签名 2.发送null,然后在这个方法里把它改成DBNull – twk 2009-02-24 22:20:33

2

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

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

0

如果该值旨在为null,则将null传递给数据库将是一个好的解决方案,这会减少用于空值的特殊值的额外逻辑处理,并且它可能相当危险且不明确。

视图或应用程序层应该能够处理从数据库返回或传递给它的null。

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

相关问题