如何以编程方式设置ADO.Net DataTable中DataColumn的NullValue属性

3
我在项目中使用许多新的由向导创建的 DataTable,需要从中提取数据。这些表中有许多字符串列具有 dbnull 值,我想将其提取为空字符串。
因此,我尝试更改每个 DataType 为 System.String 的 DataColumn 的 NullValue 属性,从 (Throw exception) 更改为 (Empty),像这样:
但我很快就厌倦了所有重复性工作,所以我尝试在应用程序的数据层中编程设置 NullValue,但是我甚至找不到这个属性。我甚至反编译了 System.Data.DataColumn 的代码,也没有发现 NullValue 属性的存在。NullValue 可能是 Microsoft.VSDesigner.Data.Design.DataColumnEditor 的一些神奇功能,但目前只是一个猜测。
那么,我如何通过编程实现与在属性编辑器中设置 NullValue 为 (Empty) 相同的效果呢?

你尝试使用“DefaultValue”属性了吗? - Crowcoder
是的,DefaultValue会起作用。 - Mahesh Malpani
不,这样行不通。设置“DefaultValue”只会影响新插入的行。在我的情况下,这些行已经存在于数据库中,我只是加载它们并希望通过强类型数据行访问它们的值。我刚刚实际尝试了一下:不起作用... - Peter Brennan
1
向导生成一个属性,其中getter返回所选的null值...因此您无法通过设置属性来分配您的null值。 - PrfctByDsgn
4个回答

1

是的,DataColumn的DefaultValue属性不起作用,因为您已经准备好了许多DataTable。以下是一种可能的解决方案 => 您可以先将所有表放在一个DataSet(假设为ds)中,然后使用以下代码:

for (int i = 0; i < ds.Tables.Count; i++)

{

       for (int j = 0; j < ds.Tables[i].Columns.Count; j++)
          {
              if(ds.Tables[i].Columns[j].DataType==typeof(string))
              ds.Tables[i].Columns[j].DefaultValue = "empty string";

          }

}


再次强调:这不是关于默认值的问题。它涉及到数据库中已经存在的空值。任何默认值都无济于事,因此您的答案无法按照我的意图工作。抱歉... - Peter Brennan
1
你不能仅通过设置一个属性来完成这个操作。 - kaushal sanadhya
你能另外回答并提供一些推理吗?(我现在有些怀疑,但从未有时间去检查),这样我就可以接受它了。 - Peter Brennan
为什么不可能 - Peter Brennan
当然,我很快就会发布它。 - kaushal sanadhya

1
我知道这已经过时了,但它不可能的原因是NullValue属性决定了Visual Studio为该列生成的代码。如果选择了Throw Exception,则代码会明确检查是否返回了数据库中的DbNull,并在那种情况下抛出异常。如果选择了Empty,则生成的代码在返回DbNull时返回空字符串。这是生成和编译的代码,因此无法在运行时以编程方式更改此行为。

1
要明确的是:NullValue不是DataColumn类的属性。它是TableAdapter代码生成器的方便设置,可以针对每个列进行设置。实际上,这意味着设置此“属性”控制如何生成列属性的主体(Public Property() as)。例如,如果将NullValue设置为(Empty),则会向列属性代码添加条件以检查null并返回空字符串。如果将NullValue设置为(Throw Exception),则此条件将从属性定义中省略。因此,在程序中没有编程方式可以设置此属性,因为您无法在运行时更改tableadapter代码。但是,您可以在TableAdapter的partial class中创建一个新属性(具有不同的名称,例如MyColumnName_Safe),该属性具有所需的行为。只需确保在使用代码中调用正确的属性而不是自动生成的属性即可。

0

Visual Studio将任何数据表的每个数据列视为单独的实体,因此它没有提供任何有效的方式来同时处理所有数据列。因此,我们没有编程上准确的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接