编了个程序,将扫描硬盘全文件有30多万条记录放到数据集中,recordset.用copyfromRecordset方法相当好,可是sheet只能有65355条记录.现在的解决方法是将数据集的数据存到mdb中,再经过sql处理。
问:CopyFromRecordSet可以将数据集发到excel
    数据集可以发送到mdb中,如何操作。

解决方案 »

  1.   

    先设计好mdb,里面有一个空的表。
    用纪录集打开该表,这样用扫描结果往纪录集插入纪录(当然也要调用Update进行保存),就直接追加到数据库中了。
      

  2.   

    MSDN 中 RecordSet.AddNew 有完整的例子。你只要将 AddNew、Update 操作放在循环内就可以了。
      

  3.   

    AddNew 方法范例
    该范例使用 AddNew 方法创建具有指定名称的新记录。Public Sub AddNewX()   Dim cnn1 As ADODB.Connection
       Dim rstEmployees As ADODB.Recordset
       Dim strCnn As String
       Dim strID As String
       Dim strFirstName As String
       Dim strLastName As String
       Dim booRecordAdded As Boolean' 打开连接。
       Set cnn1 = New ADODB.Connection
       strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=;"
       cnn1.Open strCnn
          
       ' 打开 Employee 表。
       Set rstEmployees = New ADODB.Recordset
       rstEmployees.CursorType = adOpenKeyset
       rstEmployees.LockType = adLockOptimistic
       rstEmployees.Open "employee", cnn1, , , adCmdTable   ' 从用户获取数据,雇员 ID 的格式应为:
       ' 名、中间名和姓的三个首字母,
       ' 五位数字,以及性别标识 M 或 F。
       ' 例如,Bill Sornsin 的雇员 ID 为:B-S55555M。
       strID = Trim(InputBox("Enter employee ID:"))
       strFirstName = Trim(InputBox("Enter first name:"))
       strLastName = Trim(InputBox("Enter last name:"))   ' 只在用户输入姓和名之后进行。
       If (strID <> "") And (strFirstName <> "") _
          And (strLastName <> "") Then      rstEmployees.AddNew
          rstEmployees!emp_id = strID
          rstEmployees!fname = strFirstName
          rstEmployees!lname = strLastName
          rstEmployees.Update
          booRecordAdded = True      ' 显示新添加的数据。
          MsgBox "New record: " & rstEmployees!emp_id & " " & _
             rstEmployees!fname & " " & rstEmployees!lname   Else
          MsgBox "Please enter an employee ID, " & _
             "first name, and last name."
       End If
          
       ' 删除新记录,因为这只是演示。
       cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"
          
       rstEmployees.Close
       cnn1.CloseEnd Sub
      

  4.   

    Ado所列只是用addnew一条条向数据库添加数据记录。我的问题是CopyFromRecordset 是将整个数据集的内容一次性传送到excel,可惜excel的每个sheet只能容纳65355条记录。因此,问的问题是mdb文件查询检索的结果是数据集,为什么不能一次性将数据集输入到mdb文件中,我只是要找这么个方法。
      

  5.   

    既然你的 RecordSet 是通过扫描硬盘得到的,为什么不直接将数据插入 mdb 的表中?又:
    CopyFromRecordset、Sheet 对象是 Excel;mdb 文件是 Access。你的问题中看不到两者有什么联系。
      

  6.   

    原来编的程序是向excel传送数据,每个sheet只能容纳65355条记录,而扫描硬盘后有30多万条记录,我一条条的加没问题,我的问题只是为什么可以用数据集向excel发送数据,用Insert+SQL(这也是数据集)可行。
    我有现成的数据集,如何加到access中。
      

  7.   

    似乎 Access 的 VBA 不能象 Excel 一样由外部程序调用,所以只能对数据库再做一遍插入。
    如果允许在 mdb 上进行用户操作,那么可以从已有的 Excel 中导入数据。
      

  8.   

    主要是excel的65355的约束,才让我有这种想法。因为,copyfromrecord的速度太快,在内存向数据集加数据也比较快。如
    在AutoCAD遍历图形文件的所有实体数据到excel,用CopyFromRecordset效率要比用ExcelAndMdbData.xlSheet.Cells(ii, 1) = .Backward方法快数据倍.遍历图形实体数据后,用CopyFromRecordset到excel用时为 遍历图形实体数据到数据集,用时:21:35:03-21:36:35 
     数据集:用CopyFromRecordset到excel用时为 21:36:35 -- 21:36:35 而用逐行逐列循环,将ExcelAndMdbData.xlSheet.Cells(ii, 1) = .Backward输到excel,用时约3分钟.
      

  9.   

    用以下程序处理30万条记录用时16分15秒。access数据库只有一个表,一个字段,这个字段是10个字节。文件大小为56.8 MB。
    11:21:40 
    300000    
    11:37:55 
    Private Function CreateConnection(AccessDbName As String) As ADODB.Connection
      Dim ConStr As String, Cnn As ADODB.Connection
      
      Set Cnn = New ADODB.Connection
      With Cnn
        .CursorLocation = adUseClient
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        ConStr = "Data Source =" & ThisWorkbook.Path & AccessDbName
        Cnn.Open ConStr
      End With
      'Debug.Print "Have been Connection " & ThisWorkbook.Path & AccessDbName
      Set CreateConnection = Cnn
    End Function
    Private Function CreateAccessDataTable(AccessDbName As String)
      Dim Cnn As ADODB.Connection, Cmd As ADODB.Command
      Set Cnn = CreateConnection(AccessDbName)
      Set Cmd = New ADODB.Command
      Set Cmd.ActiveConnection = Cnn
      Cmd.CommandText = "Create table aa(aa char(10))"
      Cmd.Execute
    End Function
    Private Function AddDataToAccessDataTable(AccessDbName As String)
      Dim Cnn As ADODB.Connection, Cmd As ADODB.Command
      Dim rsDataTable As ADODB.Recordset
      Set Cnn = CreateConnection(AccessDbName)
      
      Set rsDataTable = New ADODB.Recordset
      With rsDataTable
        .CursorType = adOpenKeyset
        .LockType = adLockPessimistic
        .Open "aa", Cnn, , , adCmdTable
      End With
      With rsDataTable
        For ii = 1 To 300000
          .AddNew
          !bb = ii
        Next ii
        .UpdateBatch
      End With
      
      Debug.Print rsDataTable!bb
    End Function
    Sub mm()
      'CreateAccessDB ("\Test.Mdb")
      'CreateAccessDataTable ("\Test.Mdb")
      Debug.Print Time()
        AddDataToAccessDataTable ("\Test.Mdb")
      Debug.Print Time()
    End Sub