gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:00 24 4
gpt4 key购买 nike

我有如下代码

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

即使 dtDetails.Rows[0]["columnName"] 为 null,上面的行始终为 not null

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 .

我强烈建议阅读此 QA: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 的支持、对象测试台功能,运行速度变慢,并永久改变了编辑器缩进的工作方式(更糟的是,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 中的 hacked-on 条件运算符:

    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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com