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:
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)?
答案 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将任何数据表的每个数据列视为单独的实体,这就是为什么它不能同时提供任何有效的方法来处理所有数据表。因此,我们没有以编程方式准确的解决方案。