MS Access: ¿Por qué ADODB.Recordset.BatchUpdate es mucho más lento que Application.ImportXML?
Estoy tratando de ejecutar el siguiente código para insertar una gran cantidad de registros (de un archivo con un formato de archivo extraño) en mi base de datos de Access 2003 desde VBA. Después de muchos, muchos experimentos, este código es el más rápido que he podido encontrar: hace 10000 registros en aproximadamente 15 segundos en mi máquina. Al menos 14.5 de esos segundos (es decir, casi todo el tiempo) está en la única llamada a UpdateBatch.
He leído en otra parte que el motor JET no es compatible con UpdateBatch. Entonces, tal vez hay una mejor manera de hacerlo.
Ahora, solo pensaría que el motor JET es muy lento, pero eso no puede ser. Después de generar la tabla 'testy' con el código a continuación, hice clic derecho, elegí Exportar y lo guardé como XML. Luego hice clic derecho, elegí Importar y volví a cargar el XML. ¿Tiempo total para importar el archivo XML? Menos de un segundo, es decir. al menos 15 veces más rápido.
¿Seguramente hay una manera eficiente de insertar datos en Access que no requiere escribir un archivo temporal?
Sub TestBatchUpdate()
CurrentDb.Execute "create table testy (x int, y int)"
Dim rs As New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "testy", CurrentProject.AccessConnection, _
adOpenStatic, adLockBatchOptimistic, adCmdTableDirect
Dim n, v
n = Array(0, 1)
v = Array(50, 55)
Debug.Print "starting loop", Time
For i = 1 To 10000
rs.AddNew n, v
Next i
Debug.Print "done loop", Time
rs.UpdateBatch
Debug.Print "done update", Time
CurrentDb.Execute "drop table testy"
End Sub
Estaría dispuesto a recurrir a C / C ++ si hay alguna API que me permita hacer inserciones rápidas de esa manera. Pero parece que no puedo encontrarlo. No puede ser que Application.ImportXML esté utilizando API indocumentadas, ¿verdad?