为什么 dataTable.Rows[0][ "columnName" ] == 空。不工作?



>我有一个如下代码

txtbox1.Text = dtDetails.Rows[0]["columnName"] == null ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();

上行总是not null即使dtDetails.Rows[0]["columnName"] is null

txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();

完美地工作。 这是为什么呢? 以及nullDBNull.Value有何不同

ADO.NET(DataSetDataTableDataRow(表示带有DBNull.Value的SQLNULL值 - 这是为了区分运行时(C#/.NET(null和SQLNULL

我强烈建议阅读此QA:DBNull的意义何在?

您可以简化代码,顺便说一句,使用DataRowExtensions- (添加对System.Data.DataSetExtensions.dll的引用(

txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();

可以更改为:

txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName")?.Trim() ?? "--";

DataRowExtensions.Field<T>( this DataRow row, String name )扩展方法检查DBNull.Value并返回null- 否则它将返回所需的字段,而不会像代码当前那样两次查找DataRow值。

Visual Studio 2010 更新

OP表示他们正在使用Visual Studio 2010(在2019年?!(,因此有几个选择:

  1. 升级到 Visual Studio 2019。与从VS2008跳到VS2010不同,没有 VS2010中删除了VS2019中仍然不可用的重要功能 - 例如,您仍然可以在VS2019中面向.NET Framework 2.0和Windows XP。
    • 免费(如啤酒(Visual Studio 2019社区与VS2010一样,现在是免费的。您还可以使用免费的开源Visual Studio Code来处理Visual C#项目。
    • (VS2010从VS2008中删除了有用的东西,如文档资源管理器,对.NET Compact Framework的支持,对象测试台功能,运行速度变慢,并永久改变了编辑器缩进的工作方式(更糟糕的是,imo((
  2. 如果你必须使用VS2010(但为什么?(,你可以破解你的MSBuild项目文件以使用更现代的C#编译器 - 但这是一个复杂的过程 - 并且没有IDE编辑器支持(所以即使项目可以正常构建,你也会得到红色波浪线(。

    Visual Studio
    • 2012 及更高版本在使用 Visual Studio 2010 SP1 或更高版本文件时不再需要单向项目和解决方案文件升级 - 因此您可以将 VS2019 与 VS2010 文件一起使用,而无需任何仍在使用 VS2010 的人抱怨。
  3. 您可以将表达式更改为在?? "--"子句之后执行Trim()

    txtbox1.Text = ( dtDetails.Rows[0].Field<String>("columnName") ?? "--" ).Trim();
    
  4. 您可以将扩展方法用作 lambda 中的黑客条件运算符:

    static class Extensions
    {
    public static TOut N<TIn,TOut>( this TIn value, Func<TIn,TOut> whenNotNull )
    where TIn : class
    where TOut : class
    {
    if( value == null ) return null;
    return whenNotNull( value );
    }
    }
    

    像这样使用:

    txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( v => v.Trim() ) ?? "--";
    
  5. 或进一步扩展:

    static class Extensions
    {
    public static TOut N<TIn,TOut>( this TIn value, Func<TOut> whenNull, Func<TIn,TOut> whenNotNull )
    where TIn : class
    where TOut : class
    {
    if( value == null ) return whenNull();
    return whenNotNull( value );
    }
    }
    

    像这样使用:

    txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( () => "--", v => v.Trim() );
    

您必须检查SQLNULL而不是网络框架null。它们是两个不同的东西

最新更新