我有如下代码
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();
工作完美。这是为什么?以及 null
与 DBNull.Value
最佳答案
ADO.NET( DataSet
、 DataTable
和 DataRow
)代表 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 年?!),因此有几个选项:
- 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 的支持、对象测试平台功能、运行速度变慢,并且永久改变了编辑器缩进的工作方式(在我看来,更糟的是))<
如果您必须使用 VS2010(但是为什么?),您可以破解您的 MSBuild 项目文件以使用更现代的 C# 编译器 - 但这是一个复杂的过程 - 并且没有IDE 编辑器支持(因此即使项目构建得很好,你也会到处看到红色波浪线)。
- 在使用 Visual Studio 2010 SP1 或更高版本的文件时,Visual Studio 2012 及更高版本不再需要单向项目和解决方案文件升级 - 因此您可以将 VS2019 与 VS2010 文件一起使用,而不会有人仍在使用 VS2010 提示。
您可以更改表达式来执行
Trim()
在?? "--"
之后子句:txtbox1.Text = ( dtDetails.Rows[0].Field<String>("columnName") ?? "--" ).Trim();
您可以使用扩展方法作为 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() ) ?? "--";
或者进一步扩展:
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/