sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo hacer que una consulta de paso a través / paso a través sea editable?

De acuerdo con mi comentario anterior y la respuesta de Yawar, no tengo conocimiento de que las consultas de paso sean editables/actualizables. Son editables en el sentido de que puede editar un objeto de consulta de paso a través guardado, pero no creo que sea posible que una consulta de paso a través produzca un conjunto de registros editable.

Básicamente, existen dos métodos para conectar Access a una fuente de datos que no sea de Access.

El primer método, y el más popular, es utilizar alguna forma de tablas vinculadas, generalmente tablas vinculadas ODBC. Hay una variedad de métodos para usar tablas vinculadas ODBC con MS Access, pero lo que la mayoría de los desarrolladores prefieren es usar conexiones DSN-Less que se actualizan o reconstruyen (eliminan y vuelven a conectar) en el momento en que se inicia la aplicación. Tenga en cuenta que cuando usa ODBC, también sigue usando DAO. DAO es el objeto de acceso a datos predeterminado integrado en MS Access e incluso cuando no escribe específicamente ningún código DAO, MS Access todavía usa DAO bajo el capó para vincular sus formularios, informes y consultas a su fuente de datos. En el caso de ODBC, en realidad termina teniendo dos capas de acceso a datos en funcionamiento, DAO y ODBC. Pero puede usar ODBC/DAO con un rendimiento bastante decente y sin escribir código (aparte de mantener las tablas vinculadas de ODBC).

El segundo método es usar ADO. Contrariamente a la creencia popular, esto no significa que tenga que usar formularios sin encuadernar. Pero sí significa que debe escribir más código que usar JET/DAO/MSAccess o DAO/ODBC/SSQL Server. Debe escribir código para traer registros de su base de datos a un conjunto de registros ADO y luego usar código para vincular su formulario a ese conjunto de registros. Tiene que escribir más código para mantener los formularios secundarios sincronizados con los formularios primarios, para insertar claves externas en los formularios secundarios cuando se crean nuevos registros y para una variedad de otras cosas también, como filtrar y clasificar como filtrado y clasificación incorporados en el formulario. Las opciones generalmente no funcionan con conjuntos de registros ADO. ADO es una excelente manera de hablar con SQL Server, ya que realmente le brinda mucho control, pero debido a que es un código intenso y las tablas vinculadas ODBC funcionan tan bien, la mayoría de los desarrolladores no recomiendan usar ADO a menos que no haya otra forma de hacer lo que quieres hacer. Un ejemplo de esto es llamar a procedimientos almacenados. Creo que las consultas de paso se pueden usar para llamar a procedimientos almacenados, pero también creo que existen algunas limitaciones (como el uso de parámetros). Creo que en la mayoría de los casos, los desarrolladores usan ADO para llamar a procedimientos almacenados. Uso mucho ADO, pero no uso mucho los procedimientos almacenados (todavía no), por lo que no tengo mucha información al respecto.

Otra cosa que vale la pena mencionar es que DAO con ODBC usa "carga diferida", pero ADO lo obliga a extraer todos los datos, lo que puede llevar mucho tiempo y consumir mucha memoria si tiene> millones de filas. De lo contrario, deberá implementar algún tipo de paginación.

Mi propia función para crear una sola tabla vinculada ODBC sin DSN se encuentra a continuación. Si es nuevo en Access y en VBA, esto probablemente no tenga mucho sentido para usted. El código elimina cualquier definición de tabla que ya exista para la tabla que está tratando de vincular, lo cual es un poco peligroso porque creo que podría eliminar una tabla local no vinculada que no desearía. El manejo de errores aquí tampoco es muy rápido, pero la mayoría de los códigos de ejemplo en línea no tienen un buen manejo de errores debido a las complicaciones que esto implica. La creación de índices de clave principal en una tabla vinculada no siempre es necesaria. Simplemente lo tengo integrado en mi función porque lo necesitaba una vez para un proyecto específico, así que ahora lo dejo ahí y lo uso, para bien o para mal.

Para hacer un uso adecuado de este código, realmente necesita tener una lista de todas sus tablas vinculadas en algún lugar e iterar a través de esa lista y llamar a esta función para cada tabla. Esta función le permite vincular la tabla con un nombre diferente al nombre real en SQL Server. También debe tener una forma de crear una cadena de conexión ODBC válida que también debe pasarse a esta función.

Private Sub LinkODBCTable(sSourceTableName As String, _
                        sLocalTableName As String, _
                        sPrimaryKeyField As String, _
                        sConString As String)

    Dim dbCurrent As DAO.Database
    Dim tdfCurrent As DAO.TableDef
    Set dbCurrent = DBEngine.Workspaces(0).Databases(0)

    On Error Resume Next
    'Be Careful, this could delete a local, non-linked table.
    dbCurrent.TableDefs.Delete sLocalTableName
    If Err.Number <> 0 Then
        If Err.Number = 3011 Then
            'Table does not exist
        Else
            MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
        End If
        Err.Clear
    End If

    On Error GoTo 0

    Set tdfCurrent = dbCurrent.CreateTableDef(sLocalTableName)
    tdfCurrent.Connect = sConString
    tdfCurrent.sourceTableName = sSourceTableName
    dbCurrent.TableDefs.Append tdfCurrent

    On Error Resume Next
    If sPrimaryKeyField <> "" Then
        dbCurrent.Execute "CREATE INDEX __UniqueIndex ON [" & sLocalTableName & "] (" & sPrimaryKeyField & ")", dbFailOnError
        If Err.Number <> 0 Then
            If Err.Number = 3283 Then
                'Primary Key Already Exists
            Else
                MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
            End If
            Err.Clear
        End If
    End If

    Set tdfCurrent = Nothing
    Set dbCurrent = Nothing
End Sub

Hay algunos recursos realmente buenos que debe consultar sobre DAO, ADO, Pass Through Queries, SQL Server, etc.:

http://technet.microsoft.com /en-us/library/bb188204%28v=sql.90%29.aspx
http://www.utteraccess.com/wiki/Elegir_entre_DAO_y_ADO

Este es un ejemplo de vinculación de un formulario a un Recordset de ADO. Sin embargo, es un poco engañoso porque es mejor tener un objeto de conexión global que permanezca abierto durante el tiempo de ejecución de la aplicación. Esto le permite usar conjuntos de registros ADO que se actualizan automáticamente. El uso de esta práctica también podría convertir su conjunto de registros en un objeto de nivel de formulario.

http://msdn.microsoft .com/en-us/library/office/bb243828%28v=office.12%29.aspx