Possible de joindre deux jeux d'enregistrements à l'aide de VBA/ADO?

L'objectif est de rejoindre une table Access avec appariement de données provenant d'une table SQL Server. Je voudrais faire cela à l'aide de tables liées à l'Accès, mais je suis en cours d'exécution dans l'Accès' BigInt problème (j'aurais une vue créée pour lancer BigInt Int mais ce n'est pas une option à l'heure actuelle).

J'ai donc essayé de créer deux jeux d'enregistrements et de se joindre à eux dans VBA/ADO. Le côté gauche de la jointure serait la table Access avec la Saison et la WeekNum et le côté droit de la jointure serait la table SQL Server avec la Saison et la Weeknum et d'autres données. Cela fonctionne très bien jusqu'à ce que j'essaie de créer un troisième jeu d'enregistrements qui est le résultat de la jointure (dans cet exemple, je n'ai pas essayé de faire une jointure, juste la première partie de la rejoindre en la sélectionnant à partir de l'Accès à un jeu d'enregistrements). J'obtiens une erreur d'Incompatibilité de Type sur la ligne quand je fais de l'Ensemble ObjRecordset3 = "SELECT * from" & Access_Recordset '.

Est-il possible de joindre deux jeux d'enregistrements? Si oui, comment est-ce fait?

Function Join()

    Dim SQL_Server_Connection As ADODB.Connection
    Set SQL_Server_Connection = New ADODB.Connection
    Dim SQL_Server_Query As String
    Dim SQL_Server_Recordset As New ADODB.Recordset

    Dim Access_Recordset As New ADODB.Recordset

    Dim ObjConnection As ADODB.Connection
    Set ObjConnection = CreateObject("ADODB.Connection")
    Dim ObjRecordset3 As New ADODB.Recordset

    ' Get data from Bump Table 3:
    Access_Recordset.Open "SELECT * FROM [Bump Table 3]", CurrentProject.Connection

    ' Open connection to SQL Server:
    SQL_Server_Connection_String = "DSN=MySQLServer"
    SQL_Server_Connection.Open SQL_Server_Connection_String

    ' Define the SQL Server query:
    SQL_Server_Query = "SELECT Season, WeekNum FROM TE"

    ' Populate the SQL_Server_Recordset:
    SQL_Server_Recordset.Open SQL_Server_Query, SQL_Server_Connection, adOpenDynamic, adLockOptimistic

    'Join Access_Recordset (Table: Bump Table 3) to SQL_Server_Recordset (Table: TE)
    Set ObjRecordset3 = "SELECT * FROM " & Access_Recordset ' Type Mismatch error on this line

    Access_Recordset.Close
    Set Access_Recordset = Nothing

    SQL_Server_Recordset.Close
    Set SQL_Server_Recordset = Nothing

    SQL_Server_Connection.Close

End Function

* Mise à JOUR *

J'ai compris comment faire pour arriver à mon but ultime qui est d'obtenir des données sur une liste de numéros de compte dans une table Access à partir de SQL Server basée sur le numéro de compte de domaine qui est commun aux deux tables. Réaliser que je peux créer une persistance de la table temporaire sur le Serveur SQL server, j'ai utilisé une combinaison de DAO et ADO pour obtenir les valeurs de la table Access et créer une table temporaire. Tout ce que j'avais à faire est d'exécuter la requête qui fait référence à la table temp. La seule chose étrange (qui n'est pas un problème à ce stade) est que si je créer la table temporaire et d'exécuter la requête sql directe dans VBA, cette configuration fonctionne. Mais si je crée le temp tableau en VBA et double-cliquez sur le pass-through d'interrogation, d'Accès, dit que la table temporaire ne peut pas être trouvé. De toute façon, voici le code:

Public Sub Insert_Into_Access_From_ADO_Recordset_Using_PTQ_Simpler()

    Dim dbs As DAO.Database
    Set dbs = CurrentDb()

    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection

    Dim rst As ADODB.Recordset

    'Open SQL Server
    Dim str_cnn As String
    str_cnn = "MYDSN"

    cnn.Open str_cnn

    ' Drop the temp table:

        Dim str_SQL_Drop_Temp_Table As String

        str_SQL_Drop_Temp_Table = "IF OBJECT_ID('tempdb..##BumpData','U') IS NOT NULL "
        str_SQL_Drop_Temp_Table = str_SQL_Drop_Temp_Table & " DROP TABLE ##BumpData "

        cnn.Execute str_SQL_Drop_Temp_Table


    ' Create the temp table:

        Dim str_SQL_Create_Temp_Table As String

        str_SQL_Create_Temp_Table = " CREATE TABLE ##BumpData "
        str_SQL_Create_Temp_Table = str_SQL_Create_Temp_Table & " " & "("
        str_SQL_Create_Temp_Table = str_SQL_Create_Temp_Table & " " & " ID INT "
        str_SQL_Create_Temp_Table = str_SQL_Create_Temp_Table & " " & " ,   AccountNumber VARCHAR(Max)"
        str_SQL_Create_Temp_Table = str_SQL_Create_Temp_Table & " " & ")"

        cnn.Execute str_SQL_Create_Temp_Table


    ' Insert values from the Access table into the temp table
    ' by looping through the Access table as a recordset:

        Dim rst_DAO As DAO.Recordset
        Set rst_DAO = dbs.OpenRecordset("Bump Data")

        Dim str_SQL_Insert As String

        rst_DAO.MoveFirst

        With rst_DAO
            Do While Not rst_DAO.EOF
                'str_Loan_Number_List = str_Loan_Number_List & "'" & Trim(rst![Loan Number]) & "'" & ","
                str_SQL_Insert = " INSERT INTO ##BumpData VALUES (" & rst_DAO![ID] & ",'" & Trim(rst_DAO![Loan Number]) & "') "
                cnn.Execute str_SQL_Insert
                .MoveNext
            Loop
        End With

    ' Run the pass-thru query which joins to the temp table:
    DoCmd.SetWarnings False
    DoCmd.RunSQL "SELECT * INTO [Bump Results] FROM [Bump PTQ]"
    DoCmd.SetWarnings True

End Sub
Le Big Int problème avec les tables liées ne se produit que dans la feuille de réponse dynamique mode d'Accès ne prend pas en charge les champs numériques au même niveau. Aussi longtemps que vous avez seulement besoin de l'utiliser dans une requête de renvoi et de ne pas mettre à jour les données vous pouvez créer une requête access à partir de la table liée et définir le mode de Snapshot, ou, à défaut, peut-être un Pass through query.
Je ne comprends pas votre commentaire. Quand j'ai créer une requête sur ma table liée qui comprend l'expression du champ TypeName(bigint_fld), il répond "Chaîne" à partir d'un instantané ou feuille de réponse dynamique des modes. Je pensais que la question était sur l'adhésion d'un Accès à un champ de type entier avec un Serveur SQL Grand champ Int.
Vous avez raison, la raison pour laquelle je l'ai mentionné que c'était parce que je me souviens en 2003, si vous avez ouvert une table liée qui a utilisé le BigInt comme un PK ensuite, vous pouvez souvent voir un flux de #Deleted plutôt que des données à cause de la feuille de réponse dynamique mode pas été en mesure de traiter la précision, la visualisation en instantané nié ce problème et j'ai pensé que peut-être il peut provoquer un problème lorsque vous essayez de lier les tables dans une requête. Bien que sans rapport avec le problème immédiat avec la question que j'ai même si elle peut venir dans maniable.

OriginalL'auteur Hugh Seagraves | 2013-01-27