2009-12-11 9 views
2

J'ai un petit problème. Je ne sais pas comment utiliser le DataSet dans VB.NET correctement.DataSet avec plusieurs tables

Dans Visual Studio 2008, j'ai créé un DataSet appelé Réseau. Pour le DataSet j'ai pris deux tables de ma base de données, tServer et tClient. tClient a une clé étrangère référençant l'ID dans tServer. Après la création du DataSet, j'ai trouvé un nouvel espace de noms appelé NetworkTableAdapter qui contient l'adaptateur pour tServer, tClient et un AdapterManager. Il existe également une nouvelle classe appelée Network, qui est le DataSet et contient les DataTables pour tServer et tClient. Mais comment puis-je remplir ces DataSet avec des données et y accéder? L'adaptateur possède uniquement des méthodes GetData() et Fill(), qui remplissent un DataTable, mais je souhaite remplir le DataSet.

Désolé pour mon mauvais anglais, j'espère que quelqu'un comprend mon problème et peut m'aider. :)

Torben

+0

Je ne m'inquiéterais pas de votre anglais; c'est parfaitement compréhensible. Mais plus important encore, votre question était détaillée et spécifique, et vous acceptez les réponses à toutes vos questions. C'est mieux que beaucoup de gens gèrent. –

Répondre

1

En ce qui im ​​conscient que vous ne pouvez pas automagiquement remplir un ensemble de données complet, il de cette façon. Vous devez remplir chaque table à l'intérieur. Pour ce faire, si vous utilisez l'ensemble de données visuel, cliquez avec le bouton droit sur l'adaptateur de table et ajoutez une requête. De là, vous pouvez soit ajouter SQL directement dans l'adaptateur de table, soit utiliser une procédure stockée. Pour l'exemple d'une sélection, la sélection doit correspondre aux colonnes de votre jeu de données.

Donc, si nous avons un DataTable appelé CustomersTable, et nous avons ajouté un func appelé « GetNewCustomers(), vous pouvez le faire CustomersTable dtCustomers = adapter.GetNewCustomers()

Voir une description beaucoup mieux et tutoriels commencer par # 1 et # 2 here

.NET 2.0 sont datasets cependant. Je vous recommande de prendre peut-être aux prises avec eux et puis regarder LINQ2Entities pour cartographier la base de données.

Hope this helps.

+0

Merci. Je sais, ce jeu de données est .NET 2.0, mais je dois utiliser .NET 2.0. :) Mais quand je dois remplir chaque table individuellement, alors je ne comprends pas l'avantage de cette classe de jeu de données générée. En dehors de cela, je ne sais pas comment remplir ces tableaux. – Torben

+0

Les tables de jeu de données sont fortement typées et peuvent être directement liées à tous les contrôles de données asp.net. Voir le lien dans ma réponse originale pour une meilleure description de la façon de remplir les tables que je pourrais donner! Commencez avec le tutoriel numéro un. – Jammin

0

Nous remplissons des ensembles de données à partir de procédures stockées renvoyant plusieurs ensembles de résultats (tables). Nos sorciers Dans les agences de l'État d'Oklahoma, j'ai fait des formulaires types.

  1. SP retourne 3 ensembles de résultats:

    CREATE PROCEDURE dbo.GetAllLists 
    AS 
    
    SELECT UserKey, FirstName, MiddleInitial, LastName, Suffix, EmailAddress, PeopleSoftID, ChangeDate, ChangeUser 
    FROM USERS 
    ORDER BY LastName, FirstName 
    
    SELECT a.UserKey, a.DisciplineID, b.Description AS 'DisciplineDescription' 
    FROM USER_DISCIPLINES a 
    INNER JOIN Discipline b ON a.DisciplineID = b.DisciplineID 
    
    SELECT a.UserKey, a.ApplicationID, b.ApplicationName, a.UserName, a.UserSID, a.UserDomain, a.Active, a.Integrated, a.PositionID, a.ChangeUser, a.ChangeDate 
    FROM USER_MAPPINGS a 
    INNER JOIN APPLICATION_TABLE b ON a.ApplicationID = b.ApplicationID 
    
  2. procédure de clsDataManagement - Procédure partielle qui fait le travail

    Public Shared Function GetInfoInDataset(ByVal StoredProcedureName As String, ByVal DatabaseID As Integer, ByVal ParamArray SQLParams() As SqlClient.SqlParameter) As DataSet 
        Dim dsTemp As New DataSet 
        Dim cmdSQL As SqlClient.SqlCommand = Nothing 
        Dim conSQL As SqlClient.SqlConnection = Nothing 
        Dim daSQL As SqlClient.SqlDataAdapter = Nothing 
        Try 
         conSQL = New SqlClient.SqlConnection(BuildConnection(DatabaseID)) 
         conSQL.Open() 
         cmdSQL = New SqlClient.SqlCommand(StoredProcedureName, conSQL) 
         cmdSQL.CommandType = CommandType.StoredProcedure 
         cmdSQL.CommandTimeout = 60 
         If Not IsNothing(SQLParams) Then 
          For Each p As SqlClient.SqlParameter In SQLParams 
           If Not IsNothing(p) Then 
            If IsNothing(p.Value) Then p.Value = DBNull.Value 
            cmdSQL.Parameters.Add(p) 
           End If 
          Next 
         End If 
         daSQL = New SqlClient.SqlDataAdapter(cmdSQL) 
         daSQL.Fill(dsTemp) 
         Return dsTemp 
        Catch sqlEx As SqlClient.SqlException 
         'MessageBox.Show("A SQL database error occurred preventing PHOCIS from performing the intended function." + Environment.NewLine + "Function was: " + StoredProcedureName + "." + Environment.NewLine + "Error was: " + sqlEx.Message & Environment.NewLine & "Please contact support for assistance.", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
         MessageBox.Show(sqlEx.Message, "Database Error", MessageBoxButtons.OK) 
         'MsgBox("There was an error retrieving the data using procedure " & StoredProcedureName & Environment.NewLine & sqlEx.Message, MsgBoxStyle.OkOnly, "Error Loading Data") 
         Return Nothing 
        Catch ex As Exception 
         'MessageBox.Show("An error occurred preventing PHOCIS from performing the intended function." + Environment.NewLine + "Function was: " + StoredProcedureName + "." + Environment.NewLine + "Error was: " + ex.Message & Environment.NewLine & "Please contact support for assistance.", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
         MessageBox.Show(ex.Message, "Database Error", MessageBoxButtons.OK) 
         'MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Error Loading Data") 
         Return Nothing 
        Finally 
         dsTemp = Nothing 
         If Not IsNothing(conSQL) Then conSQL.Close() 
         cmdSQL = Nothing 
         conSQL = Nothing 
         daSQL = Nothing 
        End Try 
    End Function 
    
    ' Missing lots of overloaded procs with name GetInfoInDataset() 
    
  3. clsData procédure d'appel:

    ''' <returns>3 tables, 
    ''' 1) OSDH_Apps.USERS 
    ''' 2) OSDH_Apps.USER_DISCIPLINES 
    ''' 3) OSDH_Apps.USER_MAPPINGS </returns> 
    Public Function GetAllUserLists() As DataSet 
        Try 
         Return GetInfoInDataset("GetAllLists") 
        Catch ex As Exception 
         Return Nothing 
        Finally   
        End Try 
    End Function 
    
    frmMain.loadstuff() 
    
    Dim userData As DataSet = Nothing 
    Dim a As New clsData 
    
    Try 
        userData = a.GetAllUserLists 
    
Questions connexes