5

J'ai des procédures stockées (elles acceptent les paramètres) qui renvoient plusieurs jeux de résultats et j'aimerais que cela soit enregistré dans un jeu de données typé.Création de DataSet entier à partir d'une procédure stockée existante

La question est: puis-je avoir Visual Studio 2010 générer l'ensemble de données typé en fonction de la procédure stockée? Je sais que je peux avoir ce pour une seule table, mais je dois l'ensemble dataSet (plusieurs tables, une pour chaque jeu de résultats)

Répondre

3

Alors, faisons une expérience pour voir s'il est possible ..

J'ai créé la procédure stockée suivante dans une base de données SQL 2008:

CREATE PROCEDURE dbo.StackOverflow3668337 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 'First bit'; 

    SELECT 'Second bit'; 
END 

Ensuite, je créé un nouveau projet dans VS2010, et a ajouté un élément DataSet au projet.

J'ai créé une connexion à la base de données dans l'Explorateur de serveurs et j'ai déplacé l'élément 'StackOverflow3668337' sur la surface du concepteur DataSet. Ceci est le résultat:

TableAdapter from DataSet Designer

Donc ce serait juste un DataTable. Donc, malheureusement, je pense que la réponse est sortie de la boîte, "Non".

Je pense que la principale raison à cela est que les TableAdapter classes qui sont générés sont simplement liés à un seul DataTable. Vous pouvez avoir plusieurs TableAdapters pour un seul DataTable mais tous doivent renvoyer les mêmes données. Il n'y a pas de capacité pour un seul TableAdapter d'interagir avec des DataTables supplémentaires.

3

Je sais que c'est vieux, mais je cam à travers cette question quand je cherchais la même réponse/similaire. Alors je me suis dit que je laisserais ce que j'ai trouvé ici pour ceux qui viendront après moi. Ce n'est pas auto-magique, mais cela vous mènera là-bas.

http://support.microsoft.com/kb/322793

Créer procédure

CREATE PROCEDURE dbo.sp_GetCustOrd 
AS 
SELECT * FROM Customers; 
SELECT * FROM Orders; 

Créer DataSet

  1. Dans Visual Studio .NET, dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
  2. Cliquez sur Projets Visual Basic sous Types de projets, puis cliquez sur Application Windows sous Modèles.
  3. Dans le menu Affichage, cliquez sur Explorateur de serveur.
  4. Dans l'Explorateur de serveurs, cliquez sur Se connecter à la base de données, puis connectez-vous à votre base de données SQL Server Northwind.
  5. Faites glisser les tables Clients et Commandes de l'Explorateur de serveurs vers le projet en cours. Notez qu'un objet SqlConnection et deux objets SqlDataAdapter sont ajoutés au projet.
  6. Dans la fenêtre Propriétés, cliquez sur Générer un jeu de données, puis ajoutez les deux tables au DataSet. Notez qu'un fichier .xsd est ajouté au projet. Le fichier .xsd est nommé en fonction du nom que vous avez choisi pour la classe DataSet.

Ajouter Relations

  1. Dans l'Explorateur de solutions, double-cliquez sur le fichier .xsd que vous avez créé dans la section précédente.
  2. Cliquez avec le bouton droit sur la table Customers dans le concepteur, pointez sur Ajouter, puis cliquez sur Nouvelle relation.
  3. Dans la boîte de dialogue Modifier la relation, sélectionnez la table Commandes en tant qu'élément enfant, puis cliquez sur OK. Cela crée une nouvelle DataRelation nommée CustomersOrders dans le schéma DataSet.
  4. Dans le menu Fichier, cliquez sur Enregistrer pour enregistrer les modifications.

Remplir

Dim da As New SqlDataAdapter("sp_GetCustOrd", SqlConnection1) 
da.SelectCommand.CommandType = CommandType.StoredProcedure 
da.TableMappings.Add("Table", "Customers") 
da.TableMappings.Add("Table1", "Orders") 
Dim ds As New CustOrd()  ' Change this name to match .xsd file name. 
da.Fill(ds) 
DataGrid1.DataSource = ds 
DataGrid1.DataMember = "Customers" 

Je sais que cet exemple est en VB, et je cherchais la réponse C#. Mais devrait être assez facile à porter.

+0

Je peux confirmer que cette méthode fonctionne. J'ai été capable de retourner deux tables dans une procédure et de remplir un ensemble de données fortement typé en utilisant cette méthode. J'ai également testé en utilisant un paramètre pour contrôler quelle table est retournée. Cela a fonctionné, mais a nécessité deux appels à da.Fill (ds.Table) et da.Fill (ds.Table1). Pas d'idée, mais fonctionne aussi si votre seul but est de réduire le nombre de procédures dans votre base de données. – bdwakefield

Questions connexes