Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como tornar uma consulta de passagem / passagem editável?


De acordo com meu comentário acima e a resposta de Yawar, não estou ciente de que as consultas de passagem são editáveis/atualizáveis. Eles são editáveis ​​no sentido de que você pode editar um objeto Pass Through Query salvo, mas não acredito que seja possível para um Pass Through Query produzir um conjunto de registros editável.

Existem basicamente dois métodos para conectar o Access a uma fonte de dados que não seja do Access.

O primeiro método, e mais popular, é usar alguma forma de tabelas vinculadas, geralmente tabelas vinculadas ODBC. Há uma variedade de métodos de uso de tabelas vinculadas ODBC com o MS Access, mas o que a maioria dos desenvolvedores prefere é usar conexões sem DSN que são atualizadas ou reconstruídas (excluídas e reconectadas) no momento em que seu aplicativo é iniciado. Esteja ciente de que, quando você usa ODBC, ainda está usando DAO. DAO é o objeto de acesso a dados padrão embutido no MS Access e mesmo quando você não escreve nenhum código DAO especificamente, o MS Access ainda está usando o DAO sob o capô para vincular seus formulários, relatórios e consultas à sua fonte de dados. No caso do ODBC, você acaba tendo duas camadas de acesso a dados no trabalho, DAO e ODBC. Mas você pode usar ODBC/DAO com desempenho bastante decente e sem escrever código (além de manter as tabelas vinculadas ao ODBC).

O segundo método é usar o ADO. Ao contrário da crença popular, isso não significa que você tenha que usar formulários não vinculados. Mas isso significa que você precisa escrever mais código do que usar JET/DAO/MSAccess ou DAO/ODBC/SSQL Server. Você precisa escrever código para trazer registros de seu banco de dados para um conjunto de registros ADO e, em seguida, usar o código para vincular seu formulário a esse conjunto de registros. Você precisa escrever mais código para manter os formulários filhos em sincronia com os formulários pai, inserir chaves estrangeiras em formulários filhos quando novos registros são criados e para uma variedade de outras coisas, como filtrar e classificar como a filtragem e classificação interna do formulário as opções geralmente não funcionam com conjuntos de registros ADO. O ADO é uma ótima maneira de conversar com o SQL Server, pois ele realmente oferece muito controle, mas como é intenso em código e como as tabelas vinculadas ODBC funcionam tão bem, a maioria dos desenvolvedores não recomenda o uso do ADO, a menos que não haja outra maneira de fazer o que você quer fazer. Um exemplo disso é chamar Stored Procedures. Acredito que as consultas de passagem podem ser usadas para chamar procedimentos armazenados, mas também acho que existem algumas limitações (como o uso de parâmetros). Acredito que na maioria dos casos os desenvolvedores usam o ADO para chamar procedimentos armazenados. Eu uso muito ADO mas não uso muito Stored Procedures (ainda não) então não tenho muitas informações sobre isso.

Uma outra coisa que vale a pena mencionar é que o DAO com ODBC usa "carregamento lento", mas o ADO força você a extrair todos os dados, o que pode consumir muito tempo e consumir muita memória se você tiver> milhões de linhas. Ou então você precisará implementar algum tipo de paginação.

Minha própria função para criar uma única tabela vinculada a ODBC sem DSN está abaixo. Se você é novo no Access e novo no VBA, isso provavelmente não fará muito sentido para você. O código exclui qualquer definição de tabela que já exista para a tabela que você está tentando vincular, o que é um pouco perigoso porque acredito que poderia excluir uma tabela local não vinculada que você não desejaria. O tratamento de erros aqui também não é muito rápido, mas a maioria dos códigos de exemplo online não tem um bom tratamento de erros devido às complicações que isso envolve. A criação de índices de chave primária em uma tabela vinculada nem sempre é necessária. Eu apenas o tenho embutido na minha função porque eu precisei dele uma vez para um projeto específico, então agora eu o deixo lá e o uso, para melhor ou para pior.

Para fazer uso adequado deste código, você realmente precisa ter uma lista de todas as suas tabelas vinculadas em algum lugar e percorrer essa lista e chamar essa função para cada tabela. Essa função permite vincular a tabela usando um nome diferente do nome real no SQL Server. Você também precisa ter uma maneira de construir uma string de conexão ODBC válida que também deve ser passada para esta função.
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

Existem alguns recursos realmente bons que você deve verificar 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/Choosing_between_DAO_and_ADO

Aqui está um exemplo de vinculação de um formulário a um conjunto de registros ADO. É um pouco enganador, porque é melhor ter um objeto de conexão global que permaneça aberto durante o tempo de execução do aplicativo. Isso permite que você use conjuntos de registros ADO que podem ser atualizados automaticamente. Usar essa prática também pode tornar seu conjunto de registros um objeto de nível de formulário.

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