2010-06-26 25 views
0

Cela semble vraiment ridicule .. qu'est-ce qui me manque?OleDb: pourquoi ne puis-je pas remplir mon ensemble de données avec le schéma complet et les informations de ma source de données facilement?

J'ai une base de données d'accès avec 5 tables.

Je souhaite remplir un ensemble de données avec tout le contenu de la base de données.

Pourquoi ne peut-il pas ressembler grossièrement à comme ça?:

dim dConnection as new oleDbConnection(connection info) 

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

da.fill(ds) 

je suis plutôt avoir à créer un adaptateur pour chaque table, l'onglet nom de la table (pourquoi?), Remplissez le schéma, puis remplir le tableau.

Ce serait sans valeur pour une énorme base de données ... il doit donc y avoir une façon plus simple d'y parvenir?

Merci !!!!!!

+1

Je ne sais rien au sujet de VB.NET, mais il ressemble vous êtes habitué à renvoyer les résultats de plusieurs instructions SELECT dans un objet. Puisque Jet/ACE ne peut pas exécuter plus d'une instruction SQL à la fois, cela serait impossible. Il doit être attendu d'un moteur de base de données qui n'a aucune interaction de gestion de processus serveur avec le magasin de données lui-même. –

Répondre

0

Voir this post forum codeguru - la dernière réponse dans la page fournit une fonction de chargement de la base de données complète d'accès dans un ensemble de données:

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