Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come rendere modificabile una query passthrough/passthru?

In linea con il mio commento sopra e la risposta di Yawar, non sono a conoscenza del fatto che le query Pass Through siano mai modificabili/aggiornabili. Sono modificabili nel senso che puoi modificare un oggetto Pass Through Query salvato, ma non credo sia possibile che una Pass Through Query produca un recordset modificabile.

Esistono fondamentalmente due metodi per connettere Access a un'origine dati non Access.

Il primo metodo, e il più diffuso, consiste nell'utilizzare una qualche forma di tabelle collegate, generalmente tabelle collegate ODBC. Esistono diversi metodi per utilizzare le tabelle collegate ODBC con MS Access, ma la maggior parte degli sviluppatori preferisce utilizzare connessioni senza DSN che vengono aggiornate o ricostruite (eliminate e riconnesse) al momento dell'avvio dell'applicazione. Tieni presente che quando utilizzi ODBC, stai ancora utilizzando DAO. DAO è l'oggetto di accesso ai dati predefinito integrato in MS Access e anche quando non si scrive alcun codice DAO in modo specifico, MS Access continua a utilizzare DAO nascosto per collegare moduli, report e query all'origine dati. Nel caso di ODBC, finisci per avere due livelli di accesso ai dati al lavoro, DAO e ODBC. Ma puoi usare ODBC/DAO con prestazioni abbastanza decenti e senza scrivere codice (a parte il mantenimento delle tabelle collegate ODBC).

Il secondo metodo consiste nell'utilizzare ADO. Contrariamente alla credenza popolare, questo non significa che devi usare moduli non rilegati. Ma significa che devi scrivere più codice rispetto all'utilizzo di JET/DAO/MSAccess o DAO/ODBC/SSQL Server. Devi scrivere il codice per importare i record dal tuo database in e ADO Recordset e quindi utilizzare il codice per associare il tuo modulo a quel Recordset. Devi scrivere più codice per mantenere i moduli figlio sincronizzati con i moduli padre, per inserire chiavi esterne nei moduli figlio quando vengono creati nuovi record e anche per una varietà di altre cose come il filtraggio e l'ordinamento come filtro e ordinamento integrati nel modulo le opzioni in genere non funzionano con i recordset ADO. ADO è un ottimo modo per parlare con SQL Server in quanto ti dà davvero molto controllo, ma poiché il codice è intenso e poiché le tabelle collegate ODBC funzionano così bene, la maggior parte degli sviluppatori non consiglia di utilizzare ADO a meno che non ci sia altro modo per fare ciò vuoi fare. Un esempio di ciò è la chiamata di stored procedure. Credo che le query Pass Through possano essere utilizzate per chiamare le stored procedure, ma penso anche che ci siano alcune limitazioni (come l'uso dei parametri). Credo che nella maggior parte dei casi gli sviluppatori utilizzino ADO per chiamare le stored procedure. Uso molto ADO ma non uso molto le stored procedure (non ancora), quindi non ho molte informazioni al riguardo.

Un'altra cosa degna di nota è che DAO con ODBC utilizza il "caricamento pigro" ma ADO ti costringe a estrarre tutti i dati che possono richiedere molto tempo e consumare molta memoria se hai> milioni di righe. Oppure dovrai implementare una sorta di paging.

La mia funzione per creare una singola tabella collegata ODBC senza DSN è di seguito. Se sei nuovo in Access e sei nuovo in VBA, questo probabilmente non avrà molto senso per te. Il codice elimina qualsiasi definizione di tabella già esistente per la tabella che stai tentando di collegare, il che è un po' pericoloso perché credo che potrebbe eliminare una tabella locale non collegata che non vorresti. Anche la gestione degli errori qui non è all'altezza, ma la maggior parte del codice di esempio online non ha una buona gestione degli errori a causa delle complicazioni che comporta. La creazione di indici di chiave primaria su una tabella collegata non è sempre necessaria. L'ho semplicemente integrato nella mia funzione perché ne avevo bisogno una volta per un progetto specifico, quindi ora lo lascio lì e lo uso, nel bene e nel male.

Per fare un uso corretto di questo codice devi davvero avere un elenco di tutte le tue tabelle collegate da qualche parte e scorrere quell'elenco e chiamare questa funzione per ogni tabella. Questa funzione consente di collegare la tabella utilizzando un nome diverso da quello effettivo in SQL Server. È inoltre necessario disporre di un modo per creare una stringa di connessione ODBC valida che deve essere passata anche in questa funzione.

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

Ci sono alcune ottime risorse che dovresti controllare riguardo DAO, ADO, Pass Through Query, SQL Server, ecc:

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

Ecco un esempio di associazione di un modulo a un recordset ADO. È un po' fuorviante perché è meglio avere un oggetto di connessione globale che rimane aperto durante il runtime dell'applicazione. Ciò consente di utilizzare recordset ADO aggiornabili automaticamente. L'utilizzo di questa pratica potrebbe anche rendere il recordset un oggetto a livello di modulo.

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