2010-01-26 2 views
1

Je travaille en C# et Visual Studio 2005. J'ai un DataSet typé que l'assistant a créé. Je vois que je peux exécuter MyGeneratedDataSet.tblFoo.Select() et obtenir des données de chaque table, mais y a-t-il un moyen de faire une requête de l'ensemble, comme la petite base de données en mémoire, ou dois-je faire c'est une table fragmentée par table?interroger un ensemble de données en même temps, avec des jointures?

Merci! Joshua

+0

Votre DataSet contient des DataRelations –

Répondre

2

Vous voulez apporter toute la base de données dans l'ensemble de données? C'est une mauvaise idée pour beaucoup de raisons, mais surtout parce que votre base de données grandit (ce qui est le point), votre consommation de ressources dans votre application va augmenter aussi, et votre application ralentira lentement.

À moins que votre base de données ne possède que deux tables (ok, peut-être trois), je ne peux pas imaginer pourquoi vous voudriez faire cela. Vous devez concevoir votre application de sorte qu'elle ne consomme que ce dont elle a besoin lorsque les utilisateurs demandent cette pièce. Essayez d'esquisser quelques fenêtres avec du bon vieux papier et un bon crayon et simulez ce que l'utilisateur verra. Je pense que vous verrez que vous ne voulez pas que toutes vos données soient dans votre main, juste ce qui est pertinent pour l'action que l'utilisateur est en train de faire.

+0

Il y a un certain nombre de tables, mais dans ce cas, seulement quelques enregistrements dans chacune d'elles, puisque j'ai ce fichier XML exporté contenant un enregistrement connecté (sur plusieurs tables) et que je veux utiliser code qui était pour le chargement de l'enregistrement à partir de la base de données, pour le charger à partir de l'ensemble de données, puis l'utilisateur peut les comparer. – Joshua

+0

Mon opinion serait toujours qu'il est préférable de charger ce que vous savez que vous devriez charger, plutôt que tout. Si vous avez toujours l'intention de le faire, vous pouvez consulter la question similaire http://stackoverflow.com/questions/2037522/how-to-load-sql-server-db-into-dataset –

0

Supposons que votre ensemble de données a deux tables (A, B)
La base de données a les mêmes tables (A, B)
Ils peuvent varier dans le nom beween DB et DataSet mais vous devez effectuer le mappage

C'est en fait assez facile.
(SQL SERVER Exemple, le code pseudoish)

string fQuery = "SELECT * FROM A;SELECT * FROM B:"; 
SqlCommand fCommand = new SqlCommand(fQuery, <connection>); 
SqlDataAdapter fAdpter = new SqlDataAdapter(fCommand); 
DataSet fSet = new DataSet(); 
fAdpter .Fill(pSet); 

Maintenant, l'ensemble est rempli dans une requête.
Cela peut être génial pour la performance.

0

(Réponse en VB, mais vous devriez être en mesure de le convertir)

Pour utiliser une requête pour charger un ensemble de données ... toute

  1. Créez votre requête multi-résultat. Faites-en une requête pour l'un des tableadapters de votre jeu de données (pour tirer parti des paramètres tapés, etc.).
  2. Surcharge cette requête avec une copie du code généré.
  3. Remplacez l'instruction de remplissage final (datatable) par une instruction fill (dataset).
  4. Exécutez le code pour mapper les tables afin de corriger les tables typées.

1) Écris une procédure stockée ou une instruction SQL contenant plusieurs instructions select qui renvoient des résultats.

2) Dans l'un de vos tableadapters de votre jeu de données, ajoutez la nouvelle requête.

3) Obtenez le code généré pour cette requête. Le plus simple est d'utiliser la méthode pour la requête dans le code puis faites un clic droit sur la méthode et sélectionnez "Aller à la définition". Mettez cette méthode dans un fichier cs ou vb distinct.(Voir bloc de code B)

Vous devez obtenir l'espace de noms et la classe partielle tableadapter pour que la méthode fonctionne.

4) Ajouter l'ensemble de données en tant que paramètre à la fonction surchargée. Cet ensemble de données sera la cible de la nouvelle instruction de remplissage. (Voir le bloc de code B)

5) Utilisez le code suivant pour faire correspondre vos tables de résultats de jeu de données.

Public Shared Sub DatasetAutoMerge(ByVal Source As Data.DataSet, ByVal Target As Data.DataSet) 
    Target.EnforceConstraints = False 

    For Each dtTarget As Data.DataTable In Target.Tables 
     For Each dtSource As Data.DataTable In Source.Tables 
      Dim dtMatch = dtSource 
      For Each dcTarget As Data.DataColumn In dtTarget.Columns 
       If Not dtSource.Columns.Contains(dcTarget.ColumnName) Then 
        'The source does not have a column we need by name, not a match' 
        dtMatch = Nothing 
        Exit For 
       End If 
      Next 

      If dtMatch IsNot Nothing Then 
       dtTarget.Merge(dtMatch, False, Data.MissingSchemaAction.Ignore) 
       Exit For 
      End If 
     Next 
    Next 

    Target.EnforceConstraints = True 
End Sub 

code-block B (échantillon de la version finale de contournement Méthode, VB)

Namespace dsMyDatasetTableAdapters 
    Partial Public Class Table1TableAdapter 
     Public Overridable Overloads Function Fill(ByVal dataset As dsMyDataset, ByVal OrderNumber As String) As Integer 
      Me.Adapter.SelectCommand = Me.CommandCollection(0) 
      If (RecordID Is Nothing) Then 
       Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value 
      Else 
       Me.Adapter.SelectCommand.Parameters(0).Value = CType(OrderNumber, String) 
      End If 

      'end autogenerated code' 

      'Start Custom Code' 
      Dim dsDump As New Data.DataSet 

      Me.Adapter.Fill(dsDump) 

      DatasetAutoMerge(dsDump, dataset) 
     End Function 

    End Class 
End Namespace 

j'ai utilisé ce processus plusieurs fois. C'est beaucoup mieux que d'écrire des requêtes séparées si vous savez que vous voulez charger tout cela en même temps. J'espère que ceci vous aide!

Questions connexes