Как сделать запрос passthrough / passthru редактируемым?

в Microsoft Access 2007 с серверной частью SQL Server мы обычно берем связанную таблицу из SQL Server в качестве формы.RecordSource редактируемой формы для изменения данных одной таблицы. Локальный запрос используется для выпусков кросс-таблиц, объединяющих поля из нескольких связанных таблиц. Локальный запрос должен быть обновляемым для изменения данных в форме редактирования.

теперь мы планируем заменить все локальные запросы запросами Passthrough, чтобы использовать собственный SQL Таблицы сервера напрямую.

Я попытался создать очень простой запрос passthru с именем qrySelProductsPassThroughEditable со следующей строкой SQL:

SELECT dbo.Products.ID, dbo.Products.Name FROM dbo.Products;

поле ID-это поле идентификатора, определенное как первичный ключ в SQL Server как определение:

CREATE TABLE [dbo].[Products](
    [ID] [int] IDENTITY(1,1) NOT NULL,
        ....
)

но Datasheet, возвращаемый сквозным запросом доступа, вообще не редактируется. Поэтому он не может использоваться как .RecordSource для формы редактирования тоже.

это противоречит ссылке это говорит, что если запрос passthru содержит все первичные ключи всех вовлеченных таблиц, запрос будет редактируемым.

заключение добавлено апостериори

в приведенных ниже обсуждениях запрос passthrough в Microsoft Access 2007 .accdb файл, .accde or .accdr (Access runtime) всегда доступен только для чтения, он никогда не редактируется. Вы должны использовать его как окончательный список, или как .RecordSource отчета, а не для формы, для которой необходимо использовать связанную таблицу или записываемый обычный запрос, включающий связанные таблицы для ввода-вывода данных.

4 ответов


в соответствии с моим комментарием выше и ответом Yawar, я не знаю, что Pass Through Queries когда-либо редактируются/обновляются. Они редактируются в том смысле, что вы можете редактировать объект save Pass Through Query, но я не верю, что для запроса Pass Through можно создать редактируемый набор записей.

существует в основном два метода подключения доступа к источнику данных без доступа.

первый и самый популярный метод-использовать некоторую форму связанных таблиц, обычно связанные таблицы ODBC. Существует множество методов использования связанных таблиц ODBC С MS Access, но большинство разработчиков предпочитают использовать соединения без DSN, которые обновляются или перестраиваются (удаляются и повторно подключаются) во время запуска приложения. Помните, что при использовании ODBC вы также используете DAO. DAO-это объект доступа к данным по умолчанию, встроенный в MS Access, и даже если вы специально не пишете код DAO, MS Access по-прежнему использует DAO под капотом для связи формы, отчеты и запросы к источнику данных. В случае ODBC вы фактически получаете два уровня доступа к данным на работе, DAO и ODBC. Но вы можете ODBC / DAO с довольно приличной производительностью и без написания кода (кроме обслуживания связанных таблиц ODBC).

второй метод - использовать ADO. Вопреки распространенному мнению, это не означает, что вы должны использовать несвязанные формы. Но это означает, что вам нужно написать больше кода, чем с помощью JET / DAO / MSAccess или Сервер DAO/ODBC/SSQL. Необходимо написать код для ввода записей из базы данных в набор записей ADO, а затем использовать код для привязки формы к этому набору записей. Вы должны написать больше кода, чтобы синхронизировать дочерние формы с родительскими, вставлять внешние ключи в дочерние формы при создании новых записей и, возможно, для множества других вещей, таких как фильтрация и сортировка. ADO-отличный способ поговорить с SQL Server, поскольку он действительно дает вам много контроля, но потому что это интенсивный код, и поскольку связанные таблицы ODBC работают так хорошо, большинство разработчиков не рекомендуют использовать ADO, если нет другого способа сделать то, что вы хотите сделать. Одним из примеров этого является вызов хранимых процедур. Я считаю, что Pass Through Queries можно использовать для вызова хранимых процедур, но я также думаю, что есть некоторые ограничения (например, использование параметров). Я считаю, что в большинстве случаев застройщики используют ADO для вызова хранимых процедур. Я использую ADO много, но я не использую хранимые процедуры много (пока нет), поэтому у меня нет много информацию о том, что.

моя собственная функция для создания одной связанной таблицы ODBC без DSN приведена ниже. Если вы новичок в доступе и новичок в VBA, это, вероятно, не будет иметь большого смысла для вас. Код удаляет любое определение таблицы, которое уже существует для таблицы, которую вы пытаетесь связать, что немного опасно, потому что я считаю, что он может удалить локальную несвязанную таблицу, которая вам не нужна. Обработка ошибок здесь тоже не очень быстра, но большинство онлайн-примеров кода не имеет хорошей обработки ошибок в нем из-за осложнений, которые связаны. Создание индексов первичного ключа в связанной таблице не всегда необходимо. Я просто встроил его в свою функцию, потому что он был нужен мне один раз для конкретного проекта, поэтому теперь я оставляю его там и использую, к лучшему или к худшему.

чтобы правильно использовать этот код вам действительно нужно иметь список всех связанных таблиц где-то и перебрать этот список и вызывать эту функцию для каждого таблица. Эта функция позволяет связать таблицу, используя другое имя, чем это фактическое имя в SQL Server. Вам также необходимо иметь Способ построения допустимой строки подключения ODBC, которая также должна быть передана в эту функцию.

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

есть несколько действительно хороших ресурсов, которые вы должны проверить относительно DAO, ADO, пройти через запросы, SQL Server и т. д:

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

вот пример привязки формы к набору записей ADO. Это немного вводит в заблуждение, потому что лучше иметь глобальный объект соединения, который остается открытым во время выполнения приложения. Это позволяет использовать наборы записей ADO, которые автоматически обновляются. С помощью эта практика также может сделать набор записей объектом уровня формы.

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


существует более простой, хорошо документированный способ открыть любую инструкцию SQL Server Select (таблицу, представление или sql-select со многими объединенными таблицами) в окне запроса MsAccess и быть редактируемым/обновляемым:

откройте окно запроса доступа и введите инструкцию SQL. Замените имя (имена) таблицы полной строкой ODBC на SQL Server в квадратных скобках, а затем точкой и именем схемы и таблицы, как показано ниже пример:

перед:

SELECT SOH.SalesOrderID, SOH.OrderDate
FROM   Sales.SalesOrderHeader as SOH 

после:

SELECT SOH.SalesOrderID, SOH.OrderDate
FROM   [ODBC;Driver=SQL Server;Server=myServer;Database=AdventureWorks2012;Trusted_Connection=Yes;MarsConn=yes;].Sales.SalesOrderHeader as SOH 

запрос обновляемым: The Access Query Window shows Data from the SQL Server according to the SQL Select statement

Примечания:

  • не каждый оператор SQL делает таблицу или представление обновляемыми. Ограничения и ограничения см. В разделе "обновляемые представления" в разделе CREATE VIEW (Transact-SQL) (https://msdn.microsoft.com/en-us/library/ms187956.aspx).
  • базовая таблица, которой вы хотите быть обновляемый в Access должен иметь метку времени или столбец RowVersion.

запросы результирующие наборы не редактируются, но запросы на основе связанных таблиц определенно.


Да, это правда, что "второй метод-использовать ADO", что свойства LinkMasterFields и LinkChildFields не работают в мультиформе, а набор записей ADO не работает в отчете Access 2013, поэтому я использую сквозной запрос. Я использую ADP+ ADPX.accde для имитации свойств LinkMasterFields и LinkChildFields в мультиформе и мульти-отчете.