/ / Możliwość łączenia dwóch zestawów rekordów za pomocą VBA / ADO? - ms-access, ado

Można połączyć dwa zestawy rekordów za pomocą VBA / ADO? - ms-access, ado

Celem jest dołączenie do tabeli dostępu z dopasowaniemdane z tabeli SQL Server. Zrobiłbym to przy użyciu połączonych tabel w programie Access, ale „uruchomiłem problem z Access” BigInt (miałbym widok utworzony, aby obsadzić BigInt jako Int, ale teraz nie jest to opcja).

Próbowałem więc stworzyć dwa zestawy rekordów idołącz do nich w VBA / ADO. Lewa strona złączenia byłaby tabelą dostępu z Season i WeekNum, a prawa strona złączenia byłaby tabelą SQL Server zawierającą Season i Weeknum oraz inne dane. Działa to dobrze, dopóki nie spróbuję utworzyć trzeciego zestawu rekordów, który jest wynikiem połączenia (w tym przykładzie nie próbowałem wykonywać łączenia, tylko pierwsza część łączenia, wybierając z zestawu rekordów Access). m uzyskiwanie błędu niezgodności typu w linii, gdy to robię Set ObjRecordset3 = "SELECT * FROM" i Access_Recordset ".

Czy jest nawet możliwe połączenie dwóch zestawów rekordów? Jeśli tak, jak to się robi?

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

* AKTUALIZACJA *

Dowiedziałem się, jak osiągnąć mój ostateczny celktóry miał uzyskać dane o liście numerów kont w tabeli dostępu z SQL Server na podstawie pola numeru konta, które jest wspólne dla obu tabel. Zdając sobie sprawę, że mogę utworzyć trwałą tabelę tymczasową na SQL Server, użyłem kombinacji DAO i ADO, aby pobrać wartości z tabeli Access i utworzyć tabelę tymczasową. Wszystko, co musiałem zrobić, to uruchomić zapytanie tranzytowe, które odwołuje się do tabeli tymczasowej. Jedyną dziwną rzeczą (która w tym momencie nie stanowi problemu) jest to, że jeśli utworzę tabelę tymczasową i uruchomię zapytanie tranzytowe w języku VBA, ta konfiguracja działa. Ale jeśli utworzę tabelę tymczasową w języku VBA i kliknę dwukrotnie kwerendę przekazującą, program Access powie, że nie można znaleźć tabeli tymczasowej. Zresztą tutaj jest kod:

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

Odpowiedzi:

3 dla odpowiedzi № 1

Zgłoszono, że ten wiersz powoduje błąd:

Set ObjRecordset3 = "SELECT * FROM " & Access_Recordset

Prawa strona = znak próbuje połączyć ciąg z ADODB.Recordset obiekt. Jest to prawdopodobnie bezpośrednia przyczyna błędu kompilacji. Jednak to nie jedyny problem z tą linią. Set <recordset object> = "any string value" nie będzie działać. I wreszcie, Access SQL nie obsługuje FROM <recordset object> dla dowolnego typu obiektu zestawu rekordów (ADO lub DAO).

Myślę, że powinieneś szukać prostszego podejścia. W następującym zapytaniu dbo_BigIntTable to łącze ODBC do tabeli SQL Server. Obejmuje pole, bigint_fld, którego typ danych SQL Server to BigInt. Jednak Access widzi to pole jako Typ tekstu. Dlatego mogę go połączyć z ciągiem odpowiednikowym pola Long Integer (tblFoo.id).

SELECT tblFoo.id, dbo_BigIntTable.bigint_fld
FROM
tblFoo
INNER JOIN dbo_BigIntTable
ON CStr(tblFoo.id) = dbo_BigIntTable.bigint_fld;

Projektant zapytań Access skarżył się, że nie może wyświetlić tego połączenia w widoku projektu, ale udało mi się utworzyć połączenie z widoku SQL i działało dobrze.