sql >> Databasteknik >  >> RDS >> Sqlserver

Hur gör man en passthrough/passthru-fråga redigerbar?

I linje med min kommentar ovan och svaret från Yawar, är jag inte medveten om att Pass Through-frågor någonsin är redigerbara/uppdaterbara. De är redigerbara i den meningen att du kan redigera ett sparat Pass Through Query-objekt, men jag tror inte att det är möjligt för en Pass Through-fråga att skapa en redigerbar postuppsättning.

Det finns i princip två metoder för att ansluta Access till en datakälla som inte har Access.

Den första metoden, och mest populära, är att använda någon form av länkade tabeller, vanligtvis ODBC-länkade tabeller. Det finns en mängd olika metoder för att använda ODBC-länkade tabeller med MS Access, men enligt vad de flesta utvecklare föredrar är att använda DSN-mindre anslutningar som uppdateras eller byggs om (raderas och återansluts) när din applikation startar. Var medveten om att när du använder ODBC använder du fortfarande DAO. DAO är standarddataåtkomstobjektet inbyggt i MS Access och även när du inte specifikt skriver någon DAO-kod använder MS Access fortfarande DAO under huven för att länka dina formulär, rapporter och frågor till din datakälla. När det gäller ODBC har du faktiskt två dataåtkomstlager på jobbet, DAO och ODBC. Men du kan använda ODBC/DAO med ganska bra prestanda och utan att skriva kod (annat än att underhålla de ODBC-länkade tabellerna).

Den andra metoden är att använda ADO. Tvärtemot vad många tror betyder det inte att du måste använda obundna former. Men det betyder att du måste skriva mer kod än att använda JET/DAO/MSAccess eller DAO/ODBC/SSQL Server. Du måste skriva kod för att ta in poster från din databas till och ADO Recordset och sedan använda kod för att binda ditt formulär till det Recordsetet. Du måste skriva mer kod för att hålla underordnade formulär synkroniserade med överordnade formulär, för att infoga främmande nycklar i underordnade formulär när nya poster skapas, och för en mängd andra saker också som filtrering och sortering som formulärets inbyggda filtrering och sortering alternativ fungerar vanligtvis inte med ADO-postuppsättningar. ADO är ett bra sätt att prata med SQL Server eftersom det verkligen ger dig mycket kontroll, men eftersom det är kodintensivt och eftersom ODBC Linked Tables fungerar så bra, rekommenderar de flesta utvecklare inte att använda ADO om det inte finns något annat sätt att göra vad du vill göra. Ett exempel på detta är att anropa lagrade procedurer. Jag tror att Pass Through Queries kan användas för att anropa lagrade procedurer, men jag tror också att det finns vissa begränsningar där (som att använda parametrar). Jag tror att utvecklare i de flesta fall använder ADO för att anropa lagrade procedurer. Jag använder ADO mycket men jag använder inte lagrade procedurer mycket (inte än) så jag har inte mycket information om det.

En annan sak som är värd att nämna är att DAO med ODBC använder "lazy loading" men ADO tvingar dig att dra all data vilket kan vara mycket tidskrävande och konsumera mycket minne om du har> miljoner rader. Annars måste du implementera någon form av personsökning.

Min egen funktion för att skapa en enda DSN-less ODBC Linked-tabell finns nedan. Om du är ny på Access och ny på VBA kommer detta förmodligen inte att vara särskilt vettigt för dig. Koden tar bort alla tabelldefinitioner som redan finns för tabellen du försöker länka, vilket är lite farligt eftersom jag tror att det kan ta bort en lokal, icke-länkad tabell som du inte vill ha. Felhanteringen här är inte riktigt aktuell heller, men de flesta online-exempelkoder har inte bra felhantering i sig på grund av de komplikationer det innebär. Skapandet av primära nyckelindex på en länkad tabell är inte alltid nödvändigt. Jag har bara det inbyggt i min funktion eftersom jag behövde det en gång för ett specifikt projekt så nu lämnar jag det där och använder det, på gott och ont.

För att använda den här koden på rätt sätt behöver du verkligen ha en lista över alla dina länkade tabeller någonstans och iterera genom den listan och anropa den här funktionen för varje tabell. Denna funktion låter dig länka tabellen med ett annat namn än det faktiska namnet i SQL Server. Du måste också ha ett sätt att bygga en giltig ODBC-anslutningssträng som också måste skickas till den här funktionen.

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

Det finns några riktigt bra resurser du bör kolla in angående 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

Här är ett exempel på att binda ett formulär till en ADO-postuppsättning. Det är dock lite missvisande eftersom det är bäst att ha ett globalt anslutningsobjekt som förblir öppet under programmets körning. Detta gör att du kan använda ADO-postuppsättningar som är automatiskt uppdateringsbara. Om du använder denna praxis kan din postuppsättning också bli ett objekt på formulärnivå.

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



  1. Kan du inte använda en LIKE-fråga i en JDBC PreparedStatement?

  2. Indexerat MySQL-fält sparar inte värde när man skapar/redigerar post via ADO

  3. Hur bestämmer jag när jag ska använda höger/vänster kopplingar eller inre kopplingar Eller hur bestämmer jag vilken tabell som finns på vilken sida?

  4. Hur konverterar man lokal tid till UTC?