(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
- 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.).
- Surcharge cette requête avec une copie du code généré.
- Remplacez l'instruction de remplissage final (datatable) par une instruction fill (dataset).
- 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!
Votre DataSet contient des DataRelations –