2013-07-10 36 views
1

我有一个xsd数据集架构,它允许我定义一个DataTable的结构。对于每一列,我设置了一个默认值,所以在构建一个新行时,我得到了实例化的值(“”代表字符串,0代表Ints),而不是DbNull加载数据表时使用默认列值以避免空值

我想保留这一点,当使用DataTable.LoadSqlDataAdapter.Fill在以下两种方法调用

Dim table1 As New CodeSetSchemas.EntityByRoleDataTable() 
Using reader As SqlDataReader = cmd.ExecuteReader() 
    table1.Load(reader) 
End Using 

Dim table2 As New CodeSetSchemas.EntityByRoleDataTable() 
Using adapter As New SqlDataAdapter(cmd) 
    adapter.Fill(table2) 
End Using 

但是,当这些方法之一创建一个新的行,他们从数据库中实际进行写的DBNull。如果我每一列AllowDBNull属性设置为False,我得到以下异常:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints. 

有没有办法填补一个DataTable时保留的每一行我的默认值?

回答

0

这并不是特别使用加载或填充,但只要读入数据读取器,并且只有在传入值不为空时才设置值,您就可以轻松完成此操作。通过从SqlDataReader获取SchemaTable,您仍然可以通过不必写出每个列名称来保持加载或填充命令的简单性。通过添加一个扩展方法的名称加载需要的默认行参数,你可以保留的外观和在实施的功能自己

负载扩展方法与默认行精氨酸的装载功能的感觉:

''' <summary> 
''' Fills a <c>System.Data.DataTable</c> with values from a data source using the supplied <c>System.Data.SqlDataReader</c>.<br/> 
''' Each row is new row is given the default values from the new row and incoming nulls are ignored 
''' </summary> 
''' <param name="dt">DataTable to fill</param> 
''' <param name="reader">A <c>System.Data.SqlDataReader</c> that provides a result set.</param> 
''' <param name="defaultRow">Default values for each DataRow</param> 
''' <remarks></remarks> 
<Extension()> _ 
Public Sub Load(ByVal dt As DataTable, ByVal reader As SqlDataReader, ByVal defaultRow As DataRow) 
    Dim newRow As DataRow 
    'get incoming data fields 
    Dim columns As List(Of String) 
    columns = reader.GetSchemaTable.AsEnumerable _ 
        .Select(Function(r) CStr(r("ColumnName"))).ToList() 

    While reader.Read() 
     'make new row and set default item array 
     newRow = dt.NewRow() 
     newRow.ItemArray = defaultRow.ItemArray 
     'copy over new values 
     For Each col As String In columns 
      If Not IsDBNull(reader(col)) Then newRow(col) = reader(col) 
     Next 
     dt.Rows.Add(newRow) 
    End While 
End Sub 

呼叫到您的调用方法是这样的:

Dim roleTable As New CodeSetSchemas.EntityByRoleDataTable() 
Using reader As SqlDataReader = cmd.ExecuteReader() 
    roleTable.Load(reader, roleTable.NewEntityByRoleRow()) 
End Using 
0

我也遇到过这个问题。不幸的是,DataTable.Load或SqlDataAdapter.Fill绕过了xsd Dataset Schema中所需的默认值。加载或填充后,您需要使用代码填写默认值。

使用加载或填充时,实际上并没有创建一个新的行本身;你从其他地方获得行。即使SQL实际上正在创建行,情况也是如此。

比使用代码修复数据表之后更好的解决方法是更改​​填充或加载中的SQL以使用IsNull(x,0)或IsNull(x,'')。

+0

谢谢。在这种情况下,我并不是很容易访问SQL。我已经发布了一些有关解决问题的工作,如果您再次遇到问题,希望它也能帮助您。 – KyleMit

+0

与代码很好的工作。 –