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

Hvordan gør man en passthrough/passthru-forespørgsel redigerbar?

I tråd med min kommentar ovenfor og svaret fra Yawar, er jeg ikke klar over, at Pass Through-forespørgsler nogensinde kan redigeres/opdateres. De er redigerbare i den forstand, at du kan redigere et gemt Pass Through Query-objekt, men jeg tror ikke, det er muligt for en Pass Through-forespørgsel at producere et redigerbart postsæt.

Der er grundlæggende to metoder til at forbinde Access til en ikke-Access-datakilde.

Den første metode, og den mest populære, er at bruge en eller anden form for sammenkædede tabeller, generelt ODBC-linkede tabeller. Der er en række forskellige metoder til at bruge ODBC-linkede tabeller med MS Access, men det, de fleste udviklere foretrækker, er at bruge DSN-mindre forbindelser, der bliver opdateret eller genopbygget (slettet og genoprettet) på det tidspunkt, hvor din applikation starter. Vær opmærksom på, at når du bruger ODBC, bruger du også stadig DAO. DAO er standarddataadgangsobjektet indbygget i MS Access, og selv når du ikke specifikt skriver nogen DAO-kode, bruger MS Access stadig DAO under hætten til at linke dine formularer, rapporter og forespørgsler til din datakilde. I tilfælde af ODBC ender du faktisk med at have to dataadgangslag på arbejde, DAO og ODBC. Men du kan bruge ODBC/DAO med ret anstændig ydeevne og uden at skrive kode (bortset fra at vedligeholde de ODBC-linkede tabeller).

Den anden metode er at bruge ADO. I modsætning til hvad folk tror, ​​betyder det ikke, at du skal bruge ubundne formularer. Men det betyder, at du skal skrive mere kode end at bruge JET/DAO/MSAccess eller DAO/ODBC/SSQL Server. Du skal skrive kode for at bringe poster fra din database ind i og ADO Recordset og derefter bruge kode til at binde din formular til det Recordset. Du skal skrive mere kode for at holde underordnede formularer synkroniseret med overordnede formularer, for at indsætte fremmednøgler i underordnede formularer, når der oprettes nye poster, og til en række andre ting også som filtrering og sortering som formularens indbyggede filtrering og sortering indstillinger fungerer normalt ikke med ADO-postsæt. ADO er en fantastisk måde at tale med SQL Server på, da det virkelig giver dig meget kontrol, men fordi det er kodeintens, og fordi ODBC Linked Tables fungerer så godt, anbefaler de fleste udviklere ikke at bruge ADO, medmindre der ikke er nogen anden måde at gøre det på. vil du lave. Et eksempel på dette er at kalde Stored Procedures. Jeg tror, ​​at Pass Through-forespørgsler kan bruges til at kalde Stored Procedures, men jeg tror også, der er nogle begrænsninger der (såsom brug af parametre). Jeg tror i de fleste tilfælde, at udviklere bruger ADO til at kalde lagrede procedurer. Jeg bruger ADO meget, men jeg bruger ikke Stored Procedures meget (ikke endnu), så jeg har ikke mange oplysninger om det.

En anden ting, der er værd at nævne, er, at DAO med ODBC bruger "doven indlæsning", men ADO tvinger dig til at trække alle data, hvilket kan være meget tidskrævende og forbruge meget hukommelse, hvis du har> millioner af rækker. Ellers bliver du nødt til at implementere en form for personsøgning.

Min egen funktion til at oprette en enkelt DSN-Less ODBC Linked tabel er nedenfor. Hvis du er ny til Access og ny til VBA, vil dette sandsynligvis ikke give meget mening for dig. Koden sletter enhver tabeldefinition, der allerede eksisterer for den tabel, du forsøger at linke, hvilket er lidt farligt, fordi jeg tror, ​​det kan slette en lokal, ikke-sammenkædet tabel, som du ikke ønsker. Fejlhåndteringen herinde er heller ikke rigtig op til hastighed, men det meste af online eksempelkoder har ikke god fejlhåndtering i sig på grund af de komplikationer, det involverer. Oprettelse af primære nøgleindekser på en sammenkædet tabel er ikke altid nødvendig. Jeg har bare det indbygget i min funktion, fordi jeg havde brug for det en gang til et specifikt projekt, så nu lader jeg det være der og bruger det på godt og ondt.

For at gøre korrekt brug af denne kode skal du virkelig have en liste over alle dine sammenkædede tabeller et eller andet sted og gentage denne liste og kalde denne funktion for hver tabel. Denne funktion giver dig mulighed for at forbinde tabellen med et andet navn end det faktiske navn i SQL Server. Du skal også have en måde at bygge en gyldig ODBC-forbindelsesstreng på, som også skal overføres til denne funktion.

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

Der er et par rigtig gode ressourcer, du bør tjekke ud vedrørende DAO, ADO, Pass Through Queries, SQL Server osv.:

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

Her er et eksempel på at binde en formular til et ADO Recordset. Det er dog lidt misvisende, fordi det er bedst at have et globalt forbindelsesobjekt, der forbliver åbent under programmets køretid. Dette giver dig mulighed for at bruge ADO-postsæt, der automatisk kan opdateres. Brug af denne praksis kan også gøre dit postsæt til et objekt på formularniveau.

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



  1. datetime-local værdi vises ikke på input-tag

  2. Kan ikke oprette forbindelse til server - En netværksrelateret eller instansspecifik fejl

  3. find fortløbende transaktion inden for 10 minutter

  4. MySQL standardværdi baseret på visning