How to programmatically set NullValue property of DataColumn of ADO.Net DataTable

时间:2015-06-26 10:21:50

标签: c# visual-studio datatable ado.net dbnull

I have many new wizard-created DataTables in my project, which I need to extract data from. There are many string columns with dbnull values in these tables, which I want to extract as empty strings.

So I went ahead and changed the NullValue property of each DataColumn with DataType of System.String from (Throw exception) to (Empty) like this:

Modifying the NullValue property of DataColumn in VS 2010

I soon got tired of all the repetitive work, so I tried to set NullValue programmatically in the data layer of my application.

I was, however, unable to even find this property. I even decompiled the code of System.Data.DataColumn and the property NullValue did not seem to exist there. NullValue may be some magic feature of Microsoft.VSDesigner.Data.Design.DataColumnEditor, but that's nothing more than a mere suspicion at the moment.

How can I programmatically achieve the same effect as if I did set NullValue to (Empty) in the property editor)?

4 个答案:

答案 0 :(得分:1)

我知道这很旧,但是之所以不可能是因为NullValue属性决定了Visual Studio为该列生成的代码。如果选择了Throw Exception,则代码将显式检查DbNull并抛出异常(如果这是从数据库返回的异常)。如果选择Empty,则返回DbNull时,生成的代码将返回一个空字符串。这是生成的代码,因此是经过编译的代码,因此您无法在运行时以编程方式更改此行为。

答案 1 :(得分:1)

要清楚:NullValue不是DataColumn类的属性。这是TableAdapter代码生成器的便利设置,可以为每列设置。实际上,这意味着设置此“属性”将控制如何生成列属性(公共属性()as)的主体。例如,如果将NullValue设置为(Empty),则使用条件会添加到列属性代码中以检查是否为null并返回空字符串。如果NullValue留给(抛出异常),则此条件将从属性定义中省略。 因此,实际上没有以编程方式设置此属性的方法,因为您无法在运行时更改tableadapter代码。但是,您可以在TableAdapter的部分类中创建具有所需行为的新属性(使用其他名称,例如MyColumnName_Safe)。只需确保在使用的代码中调用正确的属性,而不是自动生成的属性

答案 2 :(得分:0)

是。 DataColumn的DefaultValue属性不起作用,因为您已经有许多准备好的DataTables。这是一种可能的解决方案=> 您可以先将所有表放在一个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";

          }

}

答案 3 :(得分:0)

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