Чтение / запись SQL Представления сервера в MS Access с использованием SCHEMABINDING - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно перестроить ADP-проект MS Access 2003/2010, который использует SQL Представления сервера как RecordSource для всех его форм, в ACCDB MS Access 2016.

Я пытался используя проходные запросы для получения данных, и это прекрасно работает для столбцов только для чтения, однако, когда я хочу изменить значение в одном из связанных столбцов, он говорит, что RecordSet is not updateable, что вы можете ожидать при использовании представления.

Но теперь я прочитал, что если вы определяете представление с помощью SCHEMABINDING следующим образом:

ALTER VIEW [dbo].[vwQuote_MinibusesDetails]
WITH SCHEMABINDING
AS
    SELECT ...

и добавляете UNIQUE CLUSTERED INDEX следующим образом:

CREATE UNIQUE CLUSTERED INDEX CIX_vwQuote_MinibusesDetails
ON vwQuote_MinibusesDetails (txtQuoteNo, txtVersion, txtVehicleNo);

и затем добавьте представление к вашему проекту как DSN-без TableDef, например

stConnect = "ODBC;Driver=SQL Server;Server=" & SERVER_NAME & ";Database=" & APP_DATABASE & ";Trusted_Connection=Yes"
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td

, оно станет редактируемым, как если бы оно было таблицей.

Однако, когда я открываю TableDef в Access он показывает все строки и столбцы, как если бы он был редактируемым, но если я пытаюсь редактировать столбец, он говорит, что есть Write Conflict с изменениями другого пользователя, когда я на 100% уверен, что нет не потому, что я единственный человек, использующий его.

Есть идеи? (Сейчас я использую Access 2010)

1 Ответ

0 голосов
/ 27 февраля 2020

Но почему все эти грузовики работают? Нет никаких причин делать всю эту дополнительную работу.

Просто свяжите и установите источник данных форм в представление. Предполагается, что вы просто свяжете все существующие представления на стороне клиента. Таким образом, при доступе все представления будут рассматриваться как простые таблицы, а представления (в отличие от проходных запросов) доступны для чтения / записи.

Таким образом, нет необходимости: иметь в своем коде ЛЮБЫЕ строки подключения. Если вы используете строки подключения в коде, то вы подходите неправильно. Просто свяжите ссылки с представлениями и установите источник данных форм в качестве этого представления.

На этом этапе формы могут редактировать данные.

Что касается транзитных запросов для управления комбинированными окнами? Не делайте этого. Хотя PT-запрос, вероятно, является самым быстрым способом получения данных, клиент доступа не может фильтровать PT-запросы. Таким образом, вы ТОЛЬКО когда-либо захотите использовать запрос PT для случаев, когда клиентская сторона НЕ обязана фильтровать результаты. Если вы связываете поле со списком с запросом PT, то Access требует и хочет ТОЛЬКО извлечь одно значение из этой таблицы для отображения. А поскольку клиент доступа не может отфильтровать запрос PT, он просканирует источник данных WHOLE для этого поля со списком, чтобы получить одно значение, отображаемое в данный момент. Если вы используете связанную таблицу (или даже представление) с тем источником, который управляет комбинированным полем, тогда клиент доступа может отфильтровать этот набор данных в ОДНУ строку. Поэтому НЕ используйте запрос PT для ЛЮБОГО случая, когда требуется фильтрация на стороне клиента. Связанное представление (или связанная таблица) в этих случаях подходит.

Итак, просто привязайте формы непосредственно к связанной таблице или связанному представлению.

Если в таблице 1 миллион строк данных, и вы говорите, сделайте следующее:

Docmd.OpenForm "frmInvoice" ,,, "InvoiceNum = 1234"

Доступ будет Откройте форму для ОДНОГО ряда данных и ТОЛЬКО потяните один ряд вниз по сетевому каналу. Это несмотря на то, что рассматриваемая форма привязана к таблице из 1 миллиона строк. Форма загружается мгновенно, и вам не нужно было писать какие-либо sql, какие-либо вещи для подключения, и в действительности не делать ничего другого, кроме того, как вы разрабатывали типичные приложения доступа.

Связанные формы - это то, как и почему Access экономит огромное количество развитие долларов. Если вы перейдете к. net, то у вас есть все виды инструментов и мастеров, которые могут помочь вам в решении этой проблемы. Таким образом, в. net вы можете принять конструктор набора данных или использовать более новую инфраструктуру сущностей.

В Access у нас нет этого огромного набора инструментов дизайнеров данных и инструментов, поэтому, если вы попытаетесь код, и кодируйте источники данных для формы, тогда вы получите наихудший возможный результат (вы пишете грузы кода, и у вас нет всех этих крутых инструментов для неограниченных форм).

Просто свяжите свои формы со связанными таблицами (или представлениями), и теперь у вас есть рабочая форма с привязкой к данным без какого-либо кода. Если вам нужно загрузить форму, то используйте стандарт «20 лет» в предложении «где» команды open form, чтобы открыть форму для одной записи. Клиент доступа ТОЛЬКО извлечет то, что вы указали в предложении “where”.

Таким образом, чтобы подключить форму для редактирования данных, требуется нулевой код. В этом случае разработчик будет следить за тем, чтобы форма не доставляла ненужные данные клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...