【问题标题】:How to save an ADO recordset into a new local table in Access 2003?如何将 ADO 记录集保存到 Access 2003 中的新本地表中?
【发布时间】:2010-07-22 05:56:40
【问题描述】:

我正在尝试将 FoxPro 9.0 数据库中的表导入 Access 2003。到目前为止,根据 Google 搜索和许多试验,我连接到表的唯一方法是以编程方式通过 OLE DB 连接。我已经建立了 3 个具有不同配置的 ODBC 连接,但它们都不起作用:我得到“未指定的错误”,我找不到任何信息。

使用 OLE DB,我可以成功连接到 FoxPro 数据库,并在 ADO 记录集中导入表。问题是我无法使用 SQL 将记录集保存到本地数据库的新表中。 ADO 记录集的行为与表不同,因此我无法查询它们。下面的代码在DoCmd.RunCommand ("select * from " & rst & " INTO newClients") 处给我一个“类型不匹配”错误。

Sub newAdoConn()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String
Dim decision As Integer

Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=vfpoledb;" & _
       "Data Source=s:\jobinfo\data\jobinfo.dbc;" & _
       "Mode=ReadWrite|Share Deny None;" & _
       "Collating Sequence=MACHINE;" & _
       "Password=''"
strSQL = "Select * from Jobs"
cnn.Open
Set rst = cnn.Execute("Select * from clients")

If rst.EOF = False Then
    Do While Not rst.EOF
        decision = MsgBox(rst.Fields!ID & " " & rst.Fields!fname & " " & rst.Fields!lname & vbCrLf & vbCrLf & "Continue?", vbYesNo)
        If decision = vbYes Then
            rst.MoveNext
        Else
            Exit Do
        End If
    Loop
End If

DoCmd.RunCommand ("select * from " & rst & " INTO newClients")
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

【问题讨论】:

  • 你不提,但是你试过Access导入功能吗?可能是 Access 没有该版本 xBase 的驱动程序,所以您是否尝试过设置 DSN 并连接到它?从 DSN 导入与其他导入操作一样简单,除了选择 DSN 的步骤。
  • 设置 ODBC 文件数据源时,出现以下错误:保留错误 (-7778);没有针对此错误的消息。当我设置与我的 foxpro 数据库 (.dbc) 文件的机器数据源连接时...我可以看到所有可以连接的表的列表。不幸的是,当我选择一个表并单击导入时,我收到以下错误:无法执行查询;找不到链接表 [Microsoft][ODBC Visual FoxPro 驱动程序]不是表。 (#123) 我尝试将数据源设置为空闲表目录,但仍然无法正常工作。似乎 OLE DB 连接是唯一的方法
  • 但我无法将 ado 记录集保存到新表中...
  • 我无法告诉您为什么 ODBC 不工作,但我不知道除了可能导致它失败的 ODBC 驱动程序的配置问题之外的任何事情。您是否检查过您是否拥有最新的 FoxPro ODBC 驱动程序?

标签: ms-access import save recordset


【解决方案1】:

我终于找到了一个不错的解决方案。它涉及使用 copyFromRecordset 函数将 ado 记录集从内存保存到 excel 文件中,然后使用 TransferSpreadsheet() 以编程方式将文件链接到 excel 中的表...

Sub saveToExcel()

Dim cnn As ADODB.Connection
    'declare variables
    Dim rs As ADODB.Recordset
    Dim strSQL As String
    Dim decision As Integer
    Dim colIndex As Integer
  '  Dim fso As New FileSystemObject
  '  Dim aFile As File

    'set up connection to foxpro database    
    Set cnn = New ADODB.Connection
       cnn.ConnectionString = "Provider=vfpoledb;" & _
           "Data Source=s:\jobinfo\data\jobinfo.dbc;" & _
           "Mode=ReadWrite|Share Deny None;" & _
           "Collating Sequence=MACHINE;" & _
           "Password=''"
    cnn.Open

   Set rs = cnn.Execute("Select * from clients")

   'Create a new workbook in Excel
   Dim oExcel As Object
   Dim oBook As Object
   Dim oSheet As Object
   Set oExcel = CreateObject("Excel.Application")
   Set oBook = oExcel.Workbooks.Add
   Set oSheet = oBook.Worksheets(1)
   oSheet.Name = "clients"

    ' Copy the column headers to the destination worksheet
    For colIndex = 0 To rs.Fields.Count - 1
        oSheet.Cells(1, colIndex + 1).Value = rs.Fields(colIndex).Name
    Next

   'Transfer the data to Excel
   oSheet.Range("A2").CopyFromRecordset rs

    ' Format the sheet bold and auto width of columns
    oSheet.Rows(1).Font.Bold = True
    oSheet.UsedRange.Columns.AutoFit


   'delete file if it exists - enable scripting runtime model for this to run
    'If (fso.FileExists("C:\Documents and Settings\user\Desktop\clients.xls")) Then
    '    aFile = fso.GetFile("C:\Documents and Settings\user\Desktop\clients.xls")
    '    aFile.Delete
    'End If

    'Save the Workbook and Quit Excel
   oBook.SaveAs "C:\Documents and Settings\user\Desktop\clients.xls"
   oExcel.Quit

   'Close the connection
   rs.Close
   cnn.Close
   MsgBox ("Exporting Clients Done")

   'link table to excel file
   DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel5, "clientsTest", "C:\Documents and Settings\user\Desktop\clients.xls", True
End Sub

【讨论】:

    【解决方案2】:

    您需要做的是将 FoxPro 表作为记录集打开,并将本地表作为另一个记录集打开。然后,您可以遍历 FoxPro 记录集并执行类似的操作

    Do until FoxProRst.EOF
       LocatRst.AddNew
          LocalRst!SomeField1=FoxProRst!SomeField1
          LocalRst!SomeField2=FoxProRst!SomeField2
          LocalRst!SomeField3=FoxProRst!SomeField3
       LocalRst.Update
       FoxProRst.MoveNext
    Loop
    

    这可能不是最快的方法,但它会起作用

    【讨论】:

    • 感谢凯文的建议。您的想法应该可行,除了我想将记录集保存到新表中,包括数据和表结构。我必须从 FoxPro 数据库中导入几十个表,每个表有 60 个或更多字段,在访问中手动创建它们,然后用记录集中的数据填充它们将是一个痛苦的过程。我会将此作为最后的手段。
    【解决方案3】:

    让我简述另一种 SQL 查询方法,它可以简化:

    '...
    'not required for first time test:
    'cnn.Execute("DROP TABLE MyNewTable")
    '...
    'create the new table in the destination Access database
    cnn.Execute("CREATE TABLE MyNewTable (MyField1 int, MyField2 VARCHAR(20), MyField3 Int)")
    
    'insert data in the new table from a select query to the original table
    Dim sSQL as string, MyOriginalDBPath as String
    sSQL = "INSERT INTO MyNewTable (MyField1, MyField2, MyField3) SELECT OriginalField1, OriginalField2, OriginalField3 FROM [" & MyOriginalDBPath & ";PWD=123].clients"
    
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    
    rs.Open sSQL, cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
    '...
    

    注意:这个“草稿”想法假设连接字符串是与 Access 数据库建立的,并且与原始数据库的连接将在 SQL 字符串内,但我不知道正确的 sintaxis。我只用不同的访问数据库测试了这种方法。 请注意,这是用于访问:...[" & MyOriginalDBPath & ";PWD=123]...

    The Jet database engine can reference external databases in SQL statements by using a special syntax 具有三种不同的格式:

    [Microsoft Access 数据库的完整路径].[表名]

    [ISAM 名称;ISAM 连接字符串].[表名称]

    [ODBC;ODBC 连接字符串].[表名]

    ...

    您可以使用 ODBC 数据源名称 (DSN) 或无 DSN 连接字符串:

    DSN:[odbc;DSN=;UID=;PWD=]

    无 DSN:[odbc;Driver={SQL Server};Server=;Database=; UID=;密码=]

    一些参考资料:

    Querying data by joining two tables in two database on different servers

    C# - Join tables from two different databases using different ODBC drivers

    【讨论】:

      【解决方案4】:

      为什么不使用 ODBC 链接到表? http://support.microsoft.com/kb/225861

      【讨论】:

      • ODBC 文件数据源给出:保留错误 (-7778);没有针对此错误的消息。与 foxpro 数据库 (.dbc) 文件的机器数据源连接提供了我可以连接到的表的列表。当我单击导入时,我得到:无法执行查询;找不到链接表 [Microsoft][ODBC Visual FoxPro 驱动程序]不是表。 (#123) DoCMD.TransferDatabase() 也不起作用,因为它无法识别表格格式。
      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多