Green-sell.info

Новые технологии
134 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access recordset не является обновляемым

Свойство Recordset (Набор записей)

Применение

Возвращает или задает объект ADO Recordset или DAO Recordset, который представляет собой источник записей для указанной формы, отчета, списка или поля со списком. Значение данного свойства доступно для чтения и записи.

выражение (обязательно). Выражение, возвращающее один из объектов из списка «Применение».

Замечания

Свойство Recordset (Набор записей) возвращает объект набора записей, который является источником данных, просматриваемых в форме, отчете, списке или поле со списком. Если форма основана, например, на запросе, ссылка на свойство Recordset эквивалентна клонированию объекта Recordset с помощью того же запроса. Однако в отличие от использования свойства RecordsetClone (Копия набора записей), назначение в качестве текущей другой записи в наборе записей, возвращаемом свойством Recordset формы, также задает текущую запись этой формы.

Это свойство можно задать только с помощью кода Visual Basic для приложений (VBA).

Доступность для чтения и записи свойства Recordset определяется типом набора записей (ADO или DAO) и типом данных (Access или SQL), которые содержатся в нем.

Чтение и запись

Чтение и запись

Чтение и запись

В следующем примере выполняется открытие формы, открытие набора записей и привязка формы к набору записей путем указания для свойства Recordset только что созданного объекта Recordset.

Global rstSuppliers As ADODB.RecordsetSub MakeRW()DoCmd.OpenForm «Suppliers»Set rstSuppliers = New ADODB.RecordsetrstSuppliers.CursorLocation = adUseClientrstSuppliers.Open «Select * From Suppliers», _CurrentProject.Connection, adOpenKeyset, adLockOptimisticSet Forms(«Suppliers»).Recordset = rstSuppliersEnd Sub

Свойство Набор записей служит для следующих целей:

Связывание нескольких форм с общим набором данных. Это позволяет синхронизировать несколько форм. Например:

Set Me.Recordset = Forms!Form1.Recordset

Использование методов, не имеющих непосредственной поддержки в формах, вместе с объектом Recordset. Например, свойство Recordset можно использовать вместе с методами ADO Find или DAO Find в пользовательском диалоговом окне для поиска записи.

Добавление в транзакцию (для которой можно выполнить откат) набора изменений, влияющих на несколько форм.

Изменение свойства Recordset также может привести к изменению свойств RecordSource (Источник записей), RecordsetType (Тип набора записей) и RecordLocks (Блокировка записей). Кроме того, некоторые связанные с данными свойства могут быть переопределены, например свойства Filter (Фильтр), FilterOn (Фильтр включен), OrderBy (Порядок сортировки) и OrderByOn (Сортировка включена).

Вызов метода Requery набора записей формы (например, Forms(0).Recordset.Requery ) может привести к превращению формы в свободную. Чтобы обновить данные в форме, привязанной к набору записей, следует задать для свойства RecordSource (Источник записей) формы само это свойство ( Forms(0).RecordSource = Forms(0).RecordSource ).

Если форма привязана к набору записей, при использовании команды «Фильтр по форме» возникает ошибка.

Пример

В следующем примере свойство Recordset используется для создания копии объекта Recordset из текущей формы. Затем в окне отладки печатаются имена полей.

В следующем примере свойство Recordset и объект Recordset используются для синхронизации набора записей с текущей записью формы. При выборе в поле со списком названия организации для поиска ее записи используется метод FindFirst, вызывающий отображение найденной записи в форме.

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

Базы данных и ADO Работа с полями объекта Recordset в ADO/VBA

9.5.4 Коллекция Fields и объекты Field

Работа с полями объекта Recordset в ADO/VBA, коллекция Fields и объекты Field, свойства Name и Value

Главное содержание Recordset — это то, что лежит в ячейках на пересечении строк (в Recordset они называются записями — records и представлены соответствующими объектами Record) и столбцов. В Recordset столбцы называются полями — объектами Field, которые сведены в коллекцию Fields. Объекты Record используются нечасто — поскольку имен у них нет, а переходить между записями проще при помощи свойств и методов самого объекта Recordset — AbsolutePosition, Find(), Move() и т.п. Коллекция же Fields и объекты Field используются практически в каждой программе.

У коллекции Fields все свойства стандартные, как у каждого объекта Collection:

  • Count — сколько всего столбцов в Recordset
  • Item — возможность вернуть нужный столбец (объект Field) по имени или номеру. Поскольку это свойство является свойством по умолчанию, то можно использовать код, как в нашем примере: rs.Fields(«CompanyName»). Есть еще один вариант синтаксиса для обращения к этому свойству:

Методы же имеются как стандартные, так и специфические:

  • Append() — возможность добавить новый столбец в Recordset. Delete() — соответственно, удалить столбец. Обе команды разрешено выполнять только на закрытом Recordset (пока не был вызван метод Open() или установлено свойство ActiveConnection).
  • Update() — сохранить изменения, внесенные в Recordset (будет произведена попытка создать новый столбец на источнике данных, если источник данных по каким-то причинам принимать эти изменения отказался, возникнет ошибка), CancelUpdate() — отменить изменения, внесенные в Recordset.
  • Refresh() — загадочный метод, который ничего не делает (о чем честно написано в документации). Обновить структуру Recordset данными с источника можно только методами самого объекта Recordset.
  • Resync() — работает только для коллекции Fields объекта Record (не Recordset), обновляя значения в строке.

Намного больше интересных свойств у объекта Field:

  • ActualSize — реальный размер данных для текущей записи, DefinedSize — номинальный размер данных для столбца (в байтах), в соответствии с полученной с источника информацией.
  • Attributes — возможность определить битовую маску для атрибутов столбца (допускает ли пустые значения, можно ли использовать отрицательные значения, можно ли обновлять, используется ли тип данных фиксированной длины и т.п.)
  • Name — просто строковое имя столбца. Для столбцов, полученных с источника, доступно только на чтение.
  • NumericScale и Precision — значения, которые определяют соответственно допустимое количество знаков после запятой и общее максимальное количество цифр, которое можно использовать для представления значения.
  • Value — самое важное свойство объекта Field. Определяет значение, которое есть в столбце (если мы пришли через коллекцию Fields объекта Record, то для этой записи, если через Fields объекта Recordset — то для текущей записи). Пример применения — в нашей строке для поиска. Доступно и на чтение, и на запись (в зависимости от типа указателя). ADO позволяет работать с большими двоичными данными (изображения, документы, архивы), что очень удобно. OriginalValue — значение, которое было в этом столбце до начала изменений, UnderlyingValue — значение, которое находится на источнике данных (пока мы работали с Recordset, оно могло быть изменено другой транзакцией, и поэтому OriginalValue и UnderlyingValue могут не совпадать). Свойство Value — это свойство по умолчанию, поэтому эти две строки равноценны:
  • Status — значение, отличное от adFieldOK (значение 0) означает, что поле было недавно программно добавлено в Recordset или при добавлении возникла ошибка на источнике данных.
  • Type — тип данных в соответствии с приведенной в документации таблицей. Например, для типа данных nvarchar возвращается 202.
Читать еще:  Запуск макроса при открытии формы access

У объекта Field есть только два метода — AppendChunk() и GetChunk(). Оба этих метода используются только для работы с большими двоичными типами данных (изображениями, документами и т.п.), когда работать обычными способами через свойство Value не получается.

DAO.Recordset.Update приводит к блокировке reckord

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

У меня есть база данных Microsoft Access, подключенная к бэкэнду MySql. Всякий раз, когда я запускаю этот код, я получаю следующую ошибку:

Ошибка 3197: ядро базы данных Microsoft Office Access остановило процесс, поскольку вы и другой пользователь пытаетесь изменить одни и те же данные одновременно.

Я думал, что база данных Access может быть повреждена, поэтому я извлек более раннюю резервную копию, но она делает то же самое, что заставляет меня думать, что это проблема MySql.

Мы используем идентичный фрагмент кода в другой версии этой базы данных, связанной с другой таблицей MySql, и она отлично работает.

Кроме того, когда я открываю запрос, на котором основан набор записей, я могу без проблем редактировать данные в запросе.

Просто добавьте, что в первом цикле обновляется rs! MyFieldInTable, а затем я получаю сообщение об ошибке.

Не похоже, что вы переходите к другой записи в наборе записей. Простое увеличение i не переходит к следующей записи. Более традиционным подходом было бы перебрать набор записей без необходимости в других ваших переменных ( i и rsCnt ).

ИЗМЕНИТЬ
После небольшого поиска я наткнулся на этот поток, который, похоже, похож на вашу проблему. В нижней части потока предлагается внести изменения в настройки ODBC для вашего DSN-сервера MySQL, выбрав вкладку «Дополнительно» и выбрав вариант «Возвратить строки соответствия». В сообщении также говорится о том, чтобы удалить связанную таблицу, а затем повторно связать ее с вашей базой данных Access.
Я не использовал Access с MySQL в прошлом, поэтому я понятия не имею, будет ли это работать или нет, поэтому будьте осторожны!

Вы также можете попробовать изменить свой набор записей, чтобы использовать флаг dbOptimistic для параметра блокировки набора записей, чтобы узнать, помогает ли это вообще:

set rs = CurrentDB.OpenRecordSet(«qryMyQuery», DB_OPEN_DYNASET, dbOptimistic)

Две вещи, которые вы можете попробовать. Сначала попробуйте добавить параметр dbSeeChanges при открытии набора записей:

Другой вариант, как предлагается @HansUp, заключается в использовании оператора обновления SQL вместо динамического набора записей. Ключом является открытие набора записей как моментального снимка, так что изменения, внесенные вами в записи, не влияют на сам набор записей.

У меня была такая же проблема, и мое решение оказалось значением по умолчанию для полей BIT (1). Доступ не нравится, чтобы они были пустыми. Убедитесь, что вы используете 0 или 1 в mysql для этих полей.

У меня нет MySQL здесь, чтобы попробовать это, но он выглядит так, как будто ваш код не продвигает набор записей после выполнения метода rs.Update, так что вы пытаетесь ограничить одно и то же поле в более жесткая запись.

Добавьте эту строку после rs.Update:

Надеюсь, что это поможет.

Попробуйте вызвать OpenRecordset из переменной объекта, установленной в CurrentDb(), а не непосредственно из CurrentDb().

Причиной такого предположения является то, что я обнаружил, что операции с CurrentDb напрямую могут вызвать ошибку «блок не установлен». Но я не получаю ошибку при использовании объектной переменной. И ISTR OpenRecordset была одной из таких операций, когда это было проблемой.

Кроме того, мое впечатление было вашим подходом — громоздкий способ выполнить эквивалент:

Однако, я подозреваю, что пример является прокси-сервером для реальной ситуации, когда подход набора записей полезен. Тем не менее это заставляет меня задаться вопросом, будете ли вы видеть ту же самую или другую ошибку при выполнении инструкции UPDATE.

Если у вас по-прежнему возникают проблемы с этим, это может помочь показать нам представление SQL для qryMyQuery.

Я обнаружил, что если вы попытаетесь сохранить данные, которые совпадают с данными, уже записанными в записи MySql, Access будет отображать такую ​​ошибку. Я пробовал некоторые предложения из этой темы, но не помог.

Простым решением для этого является сохранение немного разных данных с помощью ручной отметки времени. Вот пример взламывания поля порядка сортировки и установка его в 10, 20, 30…

Я пробовал автоматическую отметку времени в таблице MySql, но не помог, когда новые данные ввода совпадают с старыми.

Мой маленький полезный совет: бит — это очень, очень и очень плохие типы данных, которые нужно использовать при связывании таблиц SQL с Microsoft Access, потому что только SQL Server понимает, что это такое, Microsoft Access затрудняет интерпретацию того, что немного. Измените любые типы данных бит на int (целые числа) и перетащите свои таблицы, которые должны очистить все. Кроме того, убедитесь, что ваш Booleans всегда содержит 1 или 0 (не да/нет или true/flase) в вашем коде VBA, или ваши обновления не будут связаны с связанными таблицами SQL, потому что Microsoft Access попытается обновить их с помощью True/False или Да/Нет, и SQL это не понравится.

У меня также была такая же проблема; Я решил, что они добавили их в код, используя dao.recordset:

это, по-видимому, устраняет конфликт между только что открытыми данными (например, в форме) и обновляет их с помощью кода.

Извините за мой плохой английский… я много читаю, но я никогда не узнал об этом! Я просто итальянский.

Access recordset не является обновляемым

Описание
Создает новый объект Recordset и добавляет его в семейство Recordsets.

Параметры
наборЗаписей
Объектная переменная, представляющая открываемый объект Recordset.
объект
Объектная переменная, представляющая существующий объект, используемый при создании нового объекта Recordset.
источник
Выражение или переменная типа String, определяющая источник записей для нового объекта Recordset. В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи. Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы.
тип
Необязательный. Константа, указывающая тип открываемого объекта Recordset:

  • dbOpenTable — Открытие табличного объекта Recordset (только в рабочей области ядра Microsoft Jet).
  • dbOpenDynamic — Открытие объекта Recordset динамического типа, аналогичного динамическому указателю ODBC (только в рабочей области ODBCDirect)
  • dbOpenDynaset — Открытие объекта Recordset типа динамического набора записей, аналогичного указателю ключевого набора записей ODBC
  • dbOpenSnapshot — Открытие объекта Recordset типа статического набора записей, аналогичного указателю статического набора записей ODBC
  • dbOpenForwardOnly — Открытие объекта Recordset типа статического набора записей с последовательным доступом
Читать еще:  Access like в запросе

параметры
Необязательный. Произвольная комбинация следующих констант, задающих характеристики нового объекта Recordset:

  • dbAppendOnly — Пользователям разрешается только добавление новых записей в объект Recordset и запрещается изменение или удаление существующих записей (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet).
  • dbSQLPassThrough — Передача инструкции SQL для обработки источнику данных ODBC, подключенному к ядру Microsoft Jet (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet)
  • dbSeeChanges — Генерация ошибки выполнения, если один пользователь изменил данные, редактируемые другим пользователем (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet). Это удобно в ситуациях, когда несколько пользователей имеют доступ для чтения/записи к одним и тем же данным.
  • dbDenyWrite — Запрет другим пользователям изменять или добавлять записи (только для объектов Recordset в рабочей области Microsoft Jet)
  • dbDenyRead — Запрет другим пользователям на чтение данных в таблице (только для объектов Recordset типа таблицы в рабочей области Microsoft Jet)
  • dbForwardOnly — Создание объекта Recordset типа статического набора записей с последовательным доступом (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet). Данная константа включена только для совместимости с предыдущими версиями, вместо нее в аргументе тип следует использовать константу dbOpenForwardOnly
  • dbReadOnly — Запрет пользователям на внесение изменений в объект Recordset (только в рабочей области Microsoft Jet). Данная константа включена только для совместимости с предыдущими версиями, вместо нее следует использовать константу dbReadOnly в аргументе блокировки
  • dbRunAsync — Запуск асинхронного запроса (только в рабочей области ODBCDirect)
  • dbExecDirect — Запуск запроса без выполнения инструкции SQLPrepare с прямым вызовом инструкции SQLExecDirect (только в рабочей области ODBCDirect). Данный параметр нельзя использовать при открытии объекта Recordset на основе запроса с параметрами. Дополнительные сведения см. в руководстве по программированию Microsoft ODBC 3.0
  • dbInconsistent — Разрешение несогласованных обновлений (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet)
  • dbConsistent — Разрешение только согласованных обновлений (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet)

блокировки
Необязательный. Константа, определяющая тип блокировки объекта Recordset.

  • dbReadOnly — Запрет пользователям на внесение изменений в объект Recordset (настройка по умолчанию для рабочей области ODBCDirect). Использование константы dbReadOnly допускается только в одном из аргументов параметры или блокировки. Если задать эту константы в двух аргументах одновременно, возникает ошибка выполнения
  • dbPessimistic — Использование жесткой блокировки при определении возможности изменения объекта Recordset в многопользовательской среде. Страница, содержащая обрабатываемую запись, блокируется при вызове метода Edit (настройка по умолчанию для рабочей области Microsoft Jet)
  • dbOptimistic — Использование нежесткой блокировки при определении возможности изменения объекта Recordset в многопользовательской среде. Страница, содержащая обрабатываемую запись, блокируется при вызове метода Update
  • dbOptimisticValue — Использование нежесткой блокировки при конкурентном доступе на основании значений строк (только в рабочей области ODBCDirect)
  • dbOptimisticBatch — Включение режима пакетного обновления с нежесткой блокировкой (только в рабочей области ODBCDirect)

Замечания
В рабочей области ядра Microsoft Jet, если аргумент объект задает объект QueryDef или объект Recordset типа динамического набора записей или статического набора записей, а также, если аргумент источник задает инструкцию SQL или объект TableDef, представляющий присоединенную таблицу, то не допускается использование константы dbOpenTable в аргументе тип; в противном случае возникает ошибка выполнения. Если требуется использовать запрос к серверу SQL для присоединенной таблицы при подключении ядра Microsoft Jet к источнику данных ODBC, необходимо сначала указать в свойстве Connect базы данных, содержащей присоединенную таблицу, допустимую строку подключения ODBC. Для однократного прохода по объекту Recordset, открытому при подключении ядра Microsoft Jet к источнику данных ODBC, можно повысить быстродействие, задав константу dbOpenForwardOnly в аргументе тип.
Если аргумент объект задает объект Recordset типа динамического набора записей или статического набора записей, то новый объект Recordset является объектом того же типа. Если аргумент объект задает табличный объект Recordset, то новый объект является объектом Recordset типа динамического набора записей. Не допускается открытие нового объекта Recordset на основе статического набора записей с последовательным доступом или объектов Recordset ODBCDirect.
В рабочей области ODBCDirect возможно открытие Recordset, с указанием более одного запроса на выборку в аргументе источник, например:

В возвращенном объекте Recordset будут открыты результаты первого запроса. Чтобы открыть результаты следующих запросов, следует вызвать метод NextRecordset.
Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.
Константа dbSeeChanges позволяет в рабочей области Microsoft Jet перехватывать при работе с записью изменения, вносимые в ту же запись другими пользователями. Например, если два пользователя начинают изменять одну и ту же запись, успешно выполнить обновление сможет только пользователь, первым вызвавший метод Update. При вызове метода Update вторым пользователем возникнет ошибка при выполнении. Аналогично этому, ошибка выполнения возникает, если второй пользователь пытается с помощью метода Delete удалить запись, в которую первый пользователь успел занести изменения.
Обычно, перехват такой ошибки должен приводить к программному обновлению содержимого полей и загрузке измененных значений. Если ошибка возникает при попытке удаления, программа должна вывести новое содержимое записи и сообщение, показывающее, что запись недавно была изменена. Программа должна запросить подтверждение на удаление измененной записи.
Кроме того, константу dbSeeChanges следует использовать, если пользователь открывает объект Recordset при подключении ядра Microsoft Jet к источнику данных ODBC, который является таблицей Microsoft SQL Server версии 6.0 (или более поздней) со столбцом IDENTITY, в противном случае может возникнуть ошибка.
В рабочей области ODBCDirect допускается выполнение запросов в асинхронном режиме, задаваемом константой dbRunAsync в аргументе параметры. Это позволяет приложению продолжать обработку других инструкций во время выполнения запроса в фоновом режиме. Однако пользователь не сможет в этом случае получить доступ к данным в объекте Recordset до завершения запроса. Чтобы определить, закончено ли выполнение запроса, следует проверить значение свойства StillExecuting нового объекта Recordset. Если выполнение запроса занимает больше времени, чем предполагается, пользователь имеет возможность прекратить выполнение с помощью метода Cancel.
Попытка открыть несколько объектов Recordset на основе одного источника данных ODBC » & lngPrice, где lngPrice = 125,50), то при попытке открыть объект Recordset возникает ошибка. Причина заключается в том, что число преобразуется в строковое значение с использованием текущей системной настройки, а в языке SQL распознается только американский символ разделителя целой и дробной части (десятичная точка).

Читать еще:  Контекстное меню access

Пример
Следующая программа использует метод OpenRecordset для открытия пяти объектов Recordset и отображения их содержимого. Для выполнения данной процедуры требуется процедура OpenRecordsetOutput.

AccessConnection

В Access 2002 появилось новое свойство CurrentProject.AccessConnection.
В проекте adp не имеет значения что использовать: CurrentProject.AccessConnection или CurrentProject. Connection, там это равнозначные свойства.
Различия проявляются при использовании в базе данных mdb. Вот что показывает окно отладки:

? CurrentProject.Connection
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:Мои документыAccess XP2002.mdb

? CurrentProject.AccessConnection
Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=D:Мои документыAccess XP2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0

Т.е. CurrentProject.Connection использует только одного провайдера — Microsoft Jet OLEDB provider. А CurrentProject.AccessConnection использует двух провайдеров: одного для доступа к данным(параметр в строке подключения Data Provider) и другого сервис провайдера — Microsoft.Access.OLEDB.10.0. Вот этот самый другой и является сутью новшества.

Про ограничения нового сервис провайдера говорить не буду, хочу выделить только достоинства. С появлением в Access 2000 свойства формы Recordset, появилась возможность указать форме в качестве источника данных рекордсет DAO/ADO. Однако редактировать через интерфейс формы можно было только рекордсет DAO. Так вот, появление нового свойства CurrentProject.AccessConnection, а если говорить более обобщенно, нового сервис провайдера Microsoft.Access.OLEDB.10.0, сняло это ограничение в Access 2002. Теперь для того, чтоб указать форме в качестве источника данных рекордсет ADO, который будет обновляемым через интерфейс формы, необходимо чтобы Connection, в котором будет открыт этот рекордсет, использовал не только провайдера данных, но и сервис провайдера Microsoft.Access.OLEDB.10.0. Частным случаем этого правила является свойство CurrentProject.AccessConnection. Его удобно применять для открытия рекордсетов ADO, по таблицам текущей базы данных, с последующей их передачей формам в качестве источника данных.
Информации из MSDN по свойству CurrentProject.AccessConnection хватило для того, чтобы, поняв суть нововведения, использовать ее для работы с источниками данных, не присоединенными к базе данных, т.е. там, где CurrentProject.AccessConnection не может быть применен.
Привожу два примера, демонстрирующих использование в формах Access 2002 редактируемых рекордсетов ADO по разным источникам данных:

Sub Кmdb()
‘Пример подключения к другому mdb через отдельный Connection
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=D:Мои документыAccess XP2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0»
con.Open
rst.Open «Table1», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
End Sub

Sub КSQL()
‘Пример подключения к SQL Server через отдельный Connection
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=VAKSHUL;User ID=sa;Initial Catalog=Динамика;Data Provider=SQLOLEDB.1»
con.Open
rst.Open «Table1», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
End Sub

Результаты экспериментов не могут не радовать. Добавлю, что в процессе эксперимента рекордсет формы проекта adp был присвоен в качестве источника данных формы библиотечной базы mdb, и его по-прежнему можно было редактировать. Похоже, границы между mdb и adp начинают стираться 🙂

Сказанное ранее хочу дополнить результатами дополнительных экспериментов.

1.
Имеется «родная» mdb таблица. Таблица имеет первичный ключ.
Подключение через ADO к этой таблице, создав новый конекшн или используя CurrentProject.AccessConnection, дает одинаковый результат — результирующий набор в форме редактируемый.
_________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=D:Мои документыAccess XP2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0»
con.Open
rst.Open «Table2», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
___________
___________
Dim rst As New ADODB.Recordset
rst.Open «Table2», CurrentProject.AccessConnection, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
___________

Удалим в таблице первичный ключ.
Результат в обоих способах подключения одинаковый — результирующий набор в форме Не редактируемый.

2.
Имеется не присоединенная к mdb базе таблица SQL Sever. Таблица имеет первичный ключ.
Подключение через ADO к этой таблице в результате дает редактируемый набор в форме.
___________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=VAKSHUL;User ID=sa;Initial Catalog=Динамика;Data Provider=SQLOLEDB.1»
con.Open
rst.Open «tbl», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
___________

Удалим в таблице первичный ключ.
Результат подключения через ADO к этой таблице в результате дает НЕ редактируемый набор в форме.

3.
Имеется присоединенная к mdb базе таблица формата dbf. При присоединении было указано поле, выполняющего функцию поля первичного ключа.
Подключение через ADO к этой таблице, создав новый конекшн или используя CurrentProject.AccessConnection, дает одинаковый результат — результирующий набор в форме редактируемый.
__________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=D:Мои документыAccess XP2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0»
con.Open
rst.Open «comptyp», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
__________
__________
Dim rst As New ADODB.Recordset
rst.Open «comptyp», CurrentProject.AccessConnection, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
__________

Переприсоединим таблицу dbf к базе без указания поля первичного ключа.
Результат в обоих способах подключения одинаковый — результирующий набор в форме Не редактируемый.

4.
Имеется не присоединенная к mdb базе таблица dbf. Таблица, естественно, не имеет первичного ключа.
Подключение через ADO к этой таблице в результате дает HE редактируемый набор в форме.
____________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = «Provider=Microsoft.Access.OLEDB.10.0;Data Provider=MSDASQL.1;Extended Properties=»»DSN=Belch_dbf;UID=;PWD=;SourceDB=D:Мои документыdbfProd_dbfs;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;»»»
con.Open
rst.Open «select * from comptyp», con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
_____________

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

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×