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

Hus*_* Md 2 c# asp.net dbnull

我有一个像下面这样的代码

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

上面一行是始终not null即使dtDetails.Rows[0]["columnName"] is null

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

完美地工作。这是为什么?以及如何null不同DBNull.Value

Dai*_*Dai 5

ADO.NET ( DataSet, DataTable, 和DataRow) 代表 SQLNULLDBNull.Value- 这是为了区分运行时 (C#/.NET)null和 SQL NULL

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

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

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

可以改为:

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

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 2010 SP1 或更高版本文件时,Visual Studio 2012 及更高版本不再需要单向项目和解决方案文件升级 - 因此您可以将 VS2019 与 VS2010 文件一起使用,而不会有人抱怨仍在使用 VS2010。
  3. 你可以改变的表达进行Trim() ?? "--"条款:

    txtbox1.Text = ( dtDetails.Rows[0].Field<String>("columnName") ?? "--" ).Trim();
    
    Run Code Online (Sandbox Code Playgroud)
  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 );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    像这样使用:

    txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( v => v.Trim() ) ?? "--";
    
    Run Code Online (Sandbox Code Playgroud)
  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 );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    像这样使用:

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