Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 使用Vbscript将记录批量插入Access_Ms Access_Vbscript_Ado - Fatal编程技术网

Ms access 使用Vbscript将记录批量插入Access

Ms access 使用Vbscript将记录批量插入Access,ms-access,vbscript,ado,Ms Access,Vbscript,Ado,我真的很喜欢这个。我有一个vbscript,我正试图将几十万条记录插入Access数据库 显然,如果我一次只做一个,速度会非常慢,所以我想我可以通过某种事务批量插入它们。所以我试着写下: set rs = CreateObject("ADODB.recordset") rs.Open "table", objConn,, 4 For counter = 1 to 100000 rs.AddNew rs("username") = "Value" Next rs.UpdateBa

我真的很喜欢这个。我有一个vbscript,我正试图将几十万条记录插入Access数据库

显然,如果我一次只做一个,速度会非常慢,所以我想我可以通过某种事务批量插入它们。所以我试着写下:

set rs = CreateObject("ADODB.recordset")
 rs.Open "table", objConn,, 4

For counter = 1 to 100000
  rs.AddNew
  rs("username") = "Value"
Next

  rs.UpdateBatch
(objConn是数据库连接)

问题是我得到一个错误,说:

“具有挂起更改的行数超出了限制”

当有不止一个待定的变更时,我就知道了


我想我的交易设置不正确,但我有点卡住了。难道没有人能指出我的错误吗?非常感谢。

如果您正在使用OLEDB,则需要根据以下KB文章将CursorLocation属性设置为AdusClient:

你也可以考虑在较小的批次中运行,如果一次做100K慢,


编辑:是的,adUseClient需要定义为=3,或者只是在它的位置使用数字3。

为了支持我在事务中使用命令的建议,我写道 此脚本:

  Dim sAct      : sAct      = "trout"
  If goWAN.Exists( "a" ) Then sAct = goWAN( "a" )
  Dim nRecs     : nRecs     = 10
  If goWAN.Exists( "n" ) Then nRecs = CLng( goWAN( "n" ) )
  Dim sMFSpec   : sMFSpec   = goFS.GetAbsolutePathName( "..\data\ut.mdb" )
  Dim oConn     : Set oConn = CreateObject( "ADODB.Connection" )
  Dim oRs       : Set oRs   = CreateObject( "ADODB.Recordset" )

  Dim nRec, oCmd, nRA, aData, oParm

  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sMFSpec
  Set oRs.ActiveConnection = oConn

  oConn.Execute( "DELETE FROM tLines" )
  WScript.Echo "#Recs:", oConn.Execute( "SELECT COUNT(SampleText) FROM tLines" ).Fields( 0 )

  WScript.Echo sAct
  Select Case sAct
    Case "trout"
    Case "bob"
      oRs.CursorLocation = adUseClient
      oRs.CursorType = adOpenKeySet
      oRs.LockType = adLockBatchOptimistic    
    Case "eh"  
  End Select
  WScript.Echo "oRs.CursorLocation: ", oRs.CursorLocation
  WScript.Echo "oRs.CursorType: ", oRs.CursorType
  WScript.Echo "oRs.LockType: ", oRs.LockType
  Select Case sAct
    Case "trout", "bob"
      oRs.Open "tLines", oConn, , adLockBatchOptimistic
      For nRec = 1 to nRecs
          oRs.AddNew
          oRs( "SampleText" ) = "This is line " & nRec
      Next
      oRs.UpdateBatch
      oRs.Close
    Case "eh" 
      oConn.BeginTrans
      Set oParm = CreateObject( "ADODB.Parameter" )
      With oParm
        .Name      = "A"
        .Type      = adVarChar
        .Value     = ""
        .Direction = adParamInput
        .Size      = 100
      End With
      Set oCmd = CreateObject( "ADODB.Command" )
      With oCmd
        Set .ActiveConnection = oConn
            .CommandText      = "INSERT INTO tLines (SampleText) VALUES (?)"
            .CommandType      = adCmdText
            .Parameters.Append oParm
      End With

      ReDim aData( 0 )
      For nRec = 1 to nRecs
          aData( 0 ) = "This is line " & nRec
          oCmd.Execute nRA, aData, adExecuteNoRecords + adCmdText
      Next
      oConn.CommitTrans 
  End Select

  WScript.Echo "#Recs:", oConn.Execute( "SELECT COUNT(SampleText) FROM tLines" ).Fields( 0 )
  WScript.Echo "First:", oConn.Execute( "SELECT TOP 1 * FROM tLines" ).Fields( 0 )

  oConn.Close
用/n:200和/a:trout调用,显示:

  #Recs: 0
  trout
  oRs.CursorLocation:  2
  oRs.CursorType:  0
  oRs.LockType:  1
  ... xpl.vbs(246, 11) Provider: Number of rows with pending changes exceeded the limit.
所以我想,我正确地再现了你的问题。对于/a:bob:

  #Recs: 0
  bob
  oRs.CursorLocation:  3
  oRs.CursorType:  1
  oRs.LockType:  4
  #Recs: 200
  First: This is line 1
  xpl.vbs: Erfolgreich beendet. (0) [ 19.74219 secs ]
所以设置

  oRs.CursorLocation = adUseClient
  oRs.CursorType = adOpenKeySet
  oRs.LockType = adLockBatchOptimistic    
正如Bob(和Microsoft)所建议的,这是解决您问题的一种方法。为了加快速度,我放了一个 将命令导入事务:

  oConn.BeginTrans
  Set oCmd = CreateObject( "ADODB.Command" )
  ...
  ReDim aData( 0 )
  For nRec = 1 to nRecs
      aData( 0 ) = "This is line " & nRec
      oCmd.Execute nRA, aData, adExecuteNoRecords + adCmdText
  Next
  oConn.CommitTrans 
结果:

#Recs: 0
eh
oRs.CursorLocation:  2
oRs.CursorType:  0
oRs.LockType:  1
#Recs: 200
First: This is line 1
xpl.vbs: Erfolgreich beendet. (0) [ 1.47656 secs ]

从20秒到2秒(没有任何属性篡改)对我来说似乎不坏。

因此我看到了那篇文章,并尝试添加:rs.CursorLocation=adUseClient,但我得到了一个错误,说“参数类型错误,超出了可接受的范围,或者相互冲突”我不知道是什么原因造成的。事实上,我认为这可能是答案,但出于某种原因,“rs.CursorLocation=adUseClient”不起作用,我不得不使用“rs.CursorLocation=3”让我来测试一下……也许考虑在数据库中烧一堆INSERT语句而不是使用记录集对象?从哪里获取记录?外部源(文件?)?还是在内存中生成?它们是在内存中生成的。如果你觉得有帮助的话,我可以先把它们写进一个文件,但这不是做这类事情的正确方法。哦,太棒了!非常感谢。非常感谢你在这方面所做的工作。我的剧本花了很长时间,我可以泡杯茶回来,但它仍然会运行到5秒左右。