2010-06-26 58 views
0

这似乎真的很可笑..我错过了什么?OleDb:为什么我不能简单地用我的数据源中的完整模式和信息填充我的数据集?

我有5个表的访问数据库。

我想用数据库的全部内容填充数据集。

为什么不能大致看起来像这样?

dim dConnection as new oleDbConnection(connection info) 

dim dAdapter as new oledbdataadapter(SelectCommand, dConnection) 
dim dSet as oleDbDataset 

da.fill(ds) 

相反,我不得不为每个表创建一个适配器,标签表名(为什么?),填补了架构,然后填写表格。

这对于一个庞大的数据库来说毫无价值...所以必须有一个更简单的方法来解决这个问题?

谢谢!!!!!!

+1

我不知道什么VB.NET,但它看起来像你习惯于在一个对象中返回多个SELECT语句的结果。由于Jet/ACE一次不能执行多个SQL语句,因此这是不可能的。从数据库引擎中可以预料,没有服务器进程管理与数据存储本身的交互。 – 2010-06-26 22:03:34

回答

0

this codeguru论坛上发帖 - 在页面最后的答案提供了一个功能,整个访问数据库加载到数据集:

Protected Function getDataSetAndFill(ByRef connection As OleDb.OleDbConnection, Optional ByVal isExportSchema As Boolean = True) As DataSet 

    Dim myDataSet As New DataSet 
    Dim myCommand As New OleDb.OleDbCommand 
    Dim myAdapter As New OleDb.OleDbDataAdapter 

    myCommand.Connection = connection 

    'Get Database Tables 
    Dim tables As DataTable = connection.GetOleDbSchemaTable(_ 
     System.Data.OleDb.OleDbSchemaGuid.Tables, _ 
     New Object() {Nothing, Nothing, Nothing, "TABLE"}) 

    'iterate through all tables 
    Dim table As DataRow 
    For Each table In tables.Rows 

     'get current table's name 
     Dim tableName As String = table("TABLE_NAME") 

     Dim strSQL = "SELECT * FROM " & "[" & tableName & "]" 

     Dim adapter1 As New OleDb.OleDbDataAdapter(New OleDb.OleDbCommand(strSQL, connection)) 
     adapter1.FillSchema(myDataSet, SchemaType.Source, tableName) 

     'Fill the table in the dataset 
     myCommand.CommandText = strSQL 
     myAdapter.SelectCommand = myCommand 
     myAdapter.Fill(myDataSet, tableName) 
    Next 

    '''''''''''''''''''''''''''''''''''''' 
    '''' Add relationships to dataset '''' 
    '''''''''''''''''''''''''''''''''''''' 

    'First, get relationships names from database (as well as parent table and child table names) 
    Dim namesQuery As String = "SELECT DISTINCT szRelationship, szReferencedObject, szObject " & _ 
           "FROM MSysRelationships" 
    Dim namesCommand As New System.Data.OleDb.OleDbCommand(namesQuery, connection) 
    Dim namesAdapter As New System.Data.OleDb.OleDbDataAdapter(namesCommand) 
    Dim namesDataTable As New DataTable 
    namesAdapter.Fill(namesDataTable) 

    'Now, get MSysRelationship from database 
    Dim relationsQuery As String = "SELECT * FROM MSysRelationships" 
    Dim command As New System.Data.OleDb.OleDbCommand(relationsQuery, connection) 
    Dim adapter As New System.Data.OleDb.OleDbDataAdapter(command) 
    Dim relationsDataTable As New DataTable 
    adapter.Fill(relationsDataTable) 

    Dim relationsView As DataView = relationsDataTable.DefaultView 
    Dim relationName As String 
    Dim parentTableName As String 
    Dim childTablename As String 
    Dim row As DataRow 

    For Each relation As DataRow In namesDataTable.Rows 
     relationName = relation("szRelationship") 
     parentTableName = relation("szReferencedObject") 
     childTablename = relation("szObject") 

     'Keep only the record of the current relationship 
     relationsView.RowFilter = "szRelationship = '" & relationName & "'" 

     'Declare two arrays for parent and child columns arguments 
     Dim parentColumns(relationsView.Count - 1) As DataColumn 
     Dim childColumns(relationsView.Count - 1) As DataColumn 

     For i As Integer = 0 To relationsView.Count - 1 
      parentColumns(i) = myDataSet.Tables(parentTableName). _ 
          Columns(relationsView.Item(i)("szReferencedColumn")) 
      childColumns(i) = myDataSet.Tables(childTablename). _ 
          Columns(relationsView.Item(i)("szColumn")) 
     Next 

     Dim newRelation As New DataRelation(relationName, parentColumns, childColumns, False) 
     myDataSet.Relations.Add(newRelation) 
    Next 

    If isExportSchema Then 
     Dim schemaName = GetXmlSchemaFileName() 
     If File.Exists(schemaName) Then File.SetAttributes(schemaName, FileAttributes.Normal) 
     myDataSet.WriteXmlSchema(schemaName) 
    End If 
    Return myDataSet 
End Function 
相关问题