ms-access - runsql - evitar#error en access
¿Cómo se ejecuta una consulta SQL dinámica contra MS Access 2003 a través de VBA? (4)
Esta es una pregunta muy básica , pero estoy tratando de ejecutar una consulta que estoy creando a través de algunos valores de formulario en la base de datos de MS Access en la que reside el formulario. No creo que deba pasar por ADO formalmente, pero tal vez hacer.
De todos modos, algo de ayuda sería apreciada. Perdón por ser un n00b. ;)
Aquí solo en caso de que quisiera una versión ADO:
Dim cn as new ADODB.Connection, rs as new ADODB.RecordSet
Dim sql as String
set cn = CurrentProject.Connection
sql = "my dynamic sql string"
rs.Open sql, cn '', Other options for the type of recordset to open, adoOpenStatic, etc.
While Not rs.EOF
''do things with recordset
rs.MoveNext '' Can''t tell you how many times I have forgotten the MoveNext. silly.
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
DAO y ADO tienen un uso muy cercano. Obtienes más control con DAO y un rendimiento ligeramente mejor con ADO. En la mayoría de las aplicaciones de bases de datos de acceso que he encontrado, realmente no hace la diferencia. Cuando he visto una gran diferencia es con tablas vinculadas. ADO a menudo rinde mejor.
Esto es lo que terminé viniendo que realmente funciona.
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDB
Set rs = db.OpenRecordset(SQL Statement)
While Not rs.EOF
''do stuff
Wend
rs.Close
Las respuestas que le han dado y que parece estar aceptando el bucle a través de un conjunto de registros DAO. Ese es generalmente un método muy ineficiente para lograr un texto. Por ejemplo, esto:
Set db = CurrentDB()
Set rs = db.OpenRecordset("[sql]")
If rs.RecordCount > 0
rs.MoveFirst
Do While Not rs.EOF
rs.Edit
rs!Field = "New Data"
rs.Update
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
Set db = Nothing
será mucho menos eficiente que:
UPDATE MyTable SET Field = "New Data"
que se puede ejecutar con:
CurrentDb.Execute "UPDATE MyTable SET Field = ''New Data''"
Es muy raro que uno tenga que recorrer un conjunto de registros y, en la mayoría de los casos, una actualización de SQL va a ser órdenes de magnitud más rápida (además de causar bloqueos de lectura / escritura mucho más cortos en las páginas de datos).
Puede usar el siguiente código DAO para consultar un DB de acceso:
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Attendance WHERE ClassID = " & ClassID)
do while not rs.EOF
''do stuff
rs.movenext
loop
rs.Close
Set rs = Nothing
En mi caso, ClassID es un cuadro de texto en el formulario.