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

标签 c# asp.net dbnull

我有如下代码

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

即使dtDetails.Rows[0]["columnName"]为空,上面的行始终不为空,而

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

工作完美。这是为什么?以及 nullDBNull.Value

有何不同

最佳答案

ADO.NET( DataSetDataTableDataRow )代表 SQL NULL值为 DBNull.Value - 这是为了区分运行时 (C#/.NET) null来自 SQL NULL .

我强烈建议阅读此质量检查:What is the point of 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. Upgrade to Visual Studio 2019 。与从 VS2008 跳转到 VS2010 不同的是,没有 VS2010 中删除了一些重要功能,而这些功能在 VS2019 中仍然不可用 - 例如,您仍然可以在 VS2019 中以 .NET Framework 2.0 和 Windows XP 为目标。
    • 免费 ( as in beer ) Visual Studio 2019 社区的功能与 VS2010 一样,现在免费。您还可以使用免费开源的Visual Studio Code也可以使用 Visual C# 项目。
    • (VS2010 从 VS2008 中删除了有用的东西,例如文档资源管理器、对 .NET Compact Framework 的支持、对象测试平台功能、运行速度变慢,并且永久改变了编辑器缩进的工作方式(在我看来,更糟的是))<
  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();
    
  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() );
    

关于c# - 为什么 dataTable.Rows[0] ["columnName"] == null。不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57848949/

相关文章:

asp.net - 如何在 ASP.NET 5/MVC 6 的单元测试中访问 HttpContext

c# - 对象不能从 DBNull 转换为构造函数中的其他类型

c# - DBNull怎么可能不等于DBNull

javascript - 无法查看可观察对象上的数据

c# - 如何在打印之前预先测量字符串?

asp.net - 用户代理在请求中间切换?

javascript - asp.net中panzoom库和window.print()的问题

c# - VS2015社区中的单元测试异常

c# - UnityWebRequest 和/或 HttpWebRequest 在 Android 上使用 PUT 给出 403

c# - ?? system.DBNull 中的运算符