如何以编程方式设置 ADO.Net DataTable 的 DataColumn 的 NullValue 属性
How to programmatically set NullValue property of DataColumn of ADO.Net DataTable
我的项目中有许多新的向导创建的数据表,我需要从中提取数据。这些表中有许多 具有 dbnull 值 的字符串列,我想将其提取为 空字符串 .
所以我继续将每个 DataColumn
的 NullValue
属性 和 System.String
的 DataType
从 (Throw exception)
更改为 (Empty)
像这样:
我很快就厌倦了所有的重复性工作,所以我尝试在我的应用程序的数据层中以编程方式设置 NullValue
。
然而,我甚至找不到这个属性。我什至反编译了 System.Data.DataColumn
的代码, 属性 NullValue
似乎不存在。 NullValue
可能是 Microsoft.VSDesigner.Data.Design.DataColumnEditor
的一些神奇功能,但目前这只不过是一种怀疑。
如何以编程方式实现与在 属性 编辑器中将 NullValue
设置为 (Empty)
相同的效果)?
是的。 DataColumn 的 DefaultValue 属性 将不起作用,因为您已经有许多准备好的数据表。这是一种可能的解决方案=>
您可以先将所有表放在一个数据集中(比如说 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";
}
}
Visual Studio 将任何数据的每个数据列 table 视为单独的实体,这就是为什么它不提供任何有效的方式来同时处理所有数据的原因。所以我们没有编程上准确的解决方案。
我知道这是旧的,但不可能的原因是 NullValue
属性 决定了 Visual Studio 为该列生成的代码。如果选择 Throw Exception
,代码将显式检查 DbNull
,如果这是从数据库返回的内容,则抛出异常。如果选择 Empty
,则返回 DbNull
时,生成的代码将 returns 改为空字符串。这是生成并编译的代码,因此您无法在运行时以编程方式更改此行为。
明确一点:NullValue 不是 DataColumn class 的 属性。这是 TableAdapter 代码生成器的一个便利设置,可以为每一列设置。实际上,这意味着设置此 'property' 控制如何生成列的 属性 (Public 属性 () 的主体。例如,如果设置 NullValue到 (Empty) 然后将条件添加到列 属性 代码以检查空字符串和 return 空字符串。如果 NullValue 留给 (Throw Exception) 然后这个条件从 属性 定义中省略。
因此,确实没有编程方式来设置此 属性,因为您无法在 运行 时更改 tableadapter 代码。但是,您可以在部分 class 中为具有您想要的行为的 TableAdapter 创建一个新的 属性(具有不同的名称,例如 MyColumnName_Safe)。只需确保在您的消费代码
中调用正确的 属性 而不是自动生成的
我的项目中有许多新的向导创建的数据表,我需要从中提取数据。这些表中有许多 具有 dbnull 值 的字符串列,我想将其提取为 空字符串 .
所以我继续将每个 DataColumn
的 NullValue
属性 和 System.String
的 DataType
从 (Throw exception)
更改为 (Empty)
像这样:
我很快就厌倦了所有的重复性工作,所以我尝试在我的应用程序的数据层中以编程方式设置 NullValue
。
然而,我甚至找不到这个属性。我什至反编译了 System.Data.DataColumn
的代码, 属性 NullValue
似乎不存在。 NullValue
可能是 Microsoft.VSDesigner.Data.Design.DataColumnEditor
的一些神奇功能,但目前这只不过是一种怀疑。
如何以编程方式实现与在 属性 编辑器中将 NullValue
设置为 (Empty)
相同的效果)?
是的。 DataColumn 的 DefaultValue 属性 将不起作用,因为您已经有许多准备好的数据表。这是一种可能的解决方案=> 您可以先将所有表放在一个数据集中(比如说 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";
}
}
Visual Studio 将任何数据的每个数据列 table 视为单独的实体,这就是为什么它不提供任何有效的方式来同时处理所有数据的原因。所以我们没有编程上准确的解决方案。
我知道这是旧的,但不可能的原因是 NullValue
属性 决定了 Visual Studio 为该列生成的代码。如果选择 Throw Exception
,代码将显式检查 DbNull
,如果这是从数据库返回的内容,则抛出异常。如果选择 Empty
,则返回 DbNull
时,生成的代码将 returns 改为空字符串。这是生成并编译的代码,因此您无法在运行时以编程方式更改此行为。
明确一点:NullValue 不是 DataColumn class 的 属性。这是 TableAdapter 代码生成器的一个便利设置,可以为每一列设置。实际上,这意味着设置此 'property' 控制如何生成列的 属性 (Public 属性 () 的主体。例如,如果设置 NullValue到 (Empty) 然后将条件添加到列 属性 代码以检查空字符串和 return 空字符串。如果 NullValue 留给 (Throw Exception) 然后这个条件从 属性 定义中省略。 因此,确实没有编程方式来设置此 属性,因为您无法在 运行 时更改 tableadapter 代码。但是,您可以在部分 class 中为具有您想要的行为的 TableAdapter 创建一个新的 属性(具有不同的名称,例如 MyColumnName_Safe)。只需确保在您的消费代码
中调用正确的 属性 而不是自动生成的