4

目標は、AccessテーブルをSQLServerテーブルの一致するデータと結合することです。Accessでリンクされたテーブルを使用してこれを行いますが、AccessのBigIntの問題が発生しています(BigIntをIntとしてキャストするためにビューを作成しますが、現在はオプションではありません)。

そのため、2つのレコードセットを作成し、それらをVBA/ADOに結合しようとしています。結合の左側は、SeasonとWeekNumを含むAccessテーブルになり、結合の右側は、SeasonとWeeknumおよびその他のデータを含むSQLServerテーブルになります。これは、結合の結果である3番目のレコードセットを作成しようとするまでは正常に機能します(この例では、Accessレコードセットから選択して、結合の最初の部分だけで、結合を実行しようとしませんでした)。Set ObjRecordset3 = "SELECT * FROM"&Access_Recordset'を実行すると、行にTypeMismatchエラーが発生します。

2つのレコードセットを結合することも可能ですか?もしそうなら、これはどのように行われますか?

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

* アップデート *

両方のテーブルに共通のアカウント番号フィールドに基づいて、SQLServerからAccessテーブルのアカウント番号のリストに関するデータを取得するという最終的な目標を達成する方法を見つけました。SQL Serverで永続的な一時テーブルを作成できることに気づき、DAOとADOの組み合わせを使用して、Accessテーブルから値を取得し、一時テーブルを作成しました。次に、一時テーブルを参照するパススルークエリを実行するだけです。唯一の奇妙なこと(現時点では問題ではありません)は、一時テーブルを作成してVBAでパススルークエリを実行すると、このセットアップが機能することです。しかし、VBAで一時テーブルを作成し、パススルークエリをダブルクリックすると、Accessは一時テーブルが見つからないと言います。とにかく、ここにコードがあります:

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
4

1 に答える 1

3

この行がエラーをトリガーすると報告しました:

Set ObjRecordset3 = "SELECT * FROM " & Access_Recordset

記号の右側は、文字列をオブジェクト=と連結しようとします。ADODB.Recordsetこれがおそらくコンパイルエラーの直接の原因です。ただし、その行の問題はそれだけではありません。Set <recordset object> = "any string value"動作しないでしょう。そして最後に、Access SQLはFROM <recordset object>どのタイプのレコードセットオブジェクト(ADOまたはDAO)もサポートしていません。

もっと簡単なアプローチを探すべきだと思います。次のクエリでdbo_BigIntTableは、SQLServerテーブルへのODBCリンクです。bigint_fldこれには、 SQLServerデータ型がBigIntであるフィールドが含まれます。ただし、Accessはそのフィールドをテキストタイプと見なします。したがって、長整数フィールド(tblFoo.id)に相当する文字列と結合できます。

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

アクセスクエリデザイナは、その結合をデザインビューに表示できないと不満を漏らしましたが、SQLビューから結合を作成でき、正常に機能しました。

于 2013-01-27T20:12:15.960 に答える