Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak umożliwić edycję zapytania przekazującego / przekazującego?

Zgodnie z moim komentarzem powyżej i odpowiedzią Yawara, nie jestem świadomy, że zapytania typu Pass Through są kiedykolwiek edytowalne/aktualizowane. Można je edytować w tym sensie, że można edytować zapisany obiekt zapytania przekazującego, ale nie wierzę, że zapytanie przekazujące może utworzyć edytowalny zestaw rekordów.

Zasadniczo istnieją dwie metody łączenia Access ze źródłem danych innym niż Access.

Pierwsza i najbardziej popularna metoda polega na użyciu jakiejś formy tabel połączonych, zazwyczaj tabel połączonych ODBC. Istnieje wiele metod korzystania z tabel połączonych ODBC z MS Access, ale większość programistów preferuje korzystanie z połączeń bez DSN, które są odświeżane lub przebudowywane (usuwane i ponownie podłączane) w momencie uruchamiania aplikacji. Pamiętaj, że korzystając z ODBC, nadal korzystasz z DAO. DAO jest domyślnym obiektem dostępu do danych wbudowanym w MS Access i nawet jeśli nie piszesz specjalnie żadnego kodu DAO, MS Access nadal używa DAO pod maską do łączenia formularzy, raportów i zapytań ze źródłem danych. W przypadku ODBC w efekcie mamy do czynienia z dwiema warstwami dostępu do danych, DAO i ODBC. Ale możesz używać ODBC/DAO z całkiem przyzwoitą wydajnością i bez pisania kodu (poza utrzymaniem połączonych tabel ODBC).

Drugą metodą jest użycie ADO. Wbrew powszechnemu przekonaniu nie oznacza to, że musisz używać formularzy niezwiązanych. Ale oznacza to, że musisz napisać więcej kodu niż przy użyciu JET/DAO/MSAccess lub DAO/ODBC/SSQL Server. Musisz napisać kod, aby wprowadzić rekordy z bazy danych do i ADO Recordset, a następnie użyć kodu, aby powiązać formularz z tym Recordset. Musisz napisać więcej kodu, aby zsynchronizować formularze podrzędne z formularzami nadrzędnymi, aby wstawić klucze obce do formularzy podrzędnych podczas tworzenia nowych rekordów, a także do wielu innych rzeczy, takich jak filtrowanie i sortowanie jako wbudowane filtrowanie i sortowanie formularza opcje zwykle nie działają z zestawami rekordów ADO. ADO to świetny sposób na komunikowanie się z SQL Server, ponieważ zapewnia on naprawdę dużą kontrolę, ale ponieważ jest intensywny w kodzie i ponieważ tabele połączone ODBC działają tak dobrze, większość programistów nie zaleca korzystania z ADO, chyba że nie ma innego sposobu na zrobienie tego chcesz robić. Jednym z przykładów jest wywoływanie procedur składowanych. Uważam, że Pass Through Queries może być używany do wywoływania Stored Procedures, ale myślę też, że istnieją tam pewne ograniczenia (takie jak używanie parametrów). Uważam, że w większości przypadków programiści używają ADO do wywoływania procedur składowanych. Dużo używam ADO, ale nie używam zbyt wiele procedur przechowywanych (jeszcze nie), więc nie mam zbyt wielu informacji na ten temat.

Inną rzeczą, o której warto wspomnieć, jest to, że DAO z ODBC używa „leniwego ładowania”, ale ADO zmusza cię do pobrania wszystkich danych, co może być bardzo czasochłonne i pochłaniać dużo pamięci, jeśli masz> miliony wierszy. Albo będziesz musiał zaimplementować jakiś rodzaj stronicowania.

Poniżej znajduje się moja własna funkcja tworzenia pojedynczej połączonej tabeli DSN-less ODBC. Jeśli jesteś nowy w Accessie i VBA, prawdopodobnie nie będzie to miało dla Ciebie większego sensu. Kod usuwa każdą definicję tabeli, która już istnieje dla tabeli, którą próbujesz połączyć, co jest trochę niebezpieczne, ponieważ uważam, że może usunąć lokalną, niepołączoną tabelę, której nie chcesz. Obsługa błędów tutaj również nie jest zbyt szybka, ale większość przykładowego kodu online nie ma dobrej obsługi błędów z powodu komplikacji, które się z tym wiążą. Tworzenie indeksów klucza podstawowego w tabeli połączonej nie zawsze jest konieczne. Po prostu mam to wbudowane w moją funkcję, ponieważ kiedyś potrzebowałem go do konkretnego projektu, więc teraz go tam zostawiam i używam, na dobre lub na złe.

Aby właściwie wykorzystać ten kod, naprawdę musisz mieć gdzieś listę wszystkich połączonych tabel i iterować po tej liście i wywoływać tę funkcję dla każdej tabeli. Ta funkcja umożliwia połączenie tabeli przy użyciu innej nazwy niż jej rzeczywista nazwa w SQL Server. Musisz także mieć sposób na zbudowanie prawidłowego ciągu połączenia ODBC, który również musi zostać przekazany do tej funkcji.

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

Istnieje kilka naprawdę dobrych zasobów dotyczących DAO, ADO, Pass Through Queries, SQL Server itp.:

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

Oto przykład powiązania formularza z ADO Recordset. Jest to jednak trochę mylące, ponieważ najlepiej jest mieć globalny obiekt połączenia, który pozostaje otwarty podczas działania aplikacji. Pozwala to na używanie zestawów rekordów ADO, które można automatycznie aktualizować. Zastosowanie tej praktyki może również sprawić, że Twój zestaw rekordów stanie się obiektem na poziomie formularza.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki powinien być przekonwertowany typ danych odpowiedniej kolumny w komponencie przepływu danych SSIS konwertera danych?

  2. Jak naprawić stan oczekiwania na odzyskiwanie w bazie danych programu SQL Server?

  3. Czy istnieje sposób na wyłączenie wyzwalacza programu SQL Server tylko dla określonego zakresu wykonania?

  4. Wyrażenie CASE programu SQL Server

  5. Wykonaj sp_executeSql, aby wybrać...do #table, ale nie można wybrać danych tabeli tymczasowej