tipo runsql por iniciales funcion evitar error ejecutar docmd conversión consulta con buscar ms-access access-vba

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.