eramm01 Ответов: 1

ADO VBNET update / addnew вопрос


Я переношу программу VBNet из DAO в ADO. Эта база данных является базой данных *.mdb.
В DAO я выполнил следующее: открыл базу данных, создал набор записей с помощью команды SQL select. Затем я мог бы обновить его с помощью команды recordset.edit/.update или .addnew.
В АДО я делаю глупости:
Public conn3 As New ADODB.Connection
Dim rstGyles As ADODB.Recordset
gsCurrentFilePath = OpenFileDialog1.FileName
conn3.Provider = "Microsoft.Jet.OLEDB.4.0"
conn3.Open(gsCurrentFilePath)
rstGyles = conn3.Execute("SELECT * FROM bzGyle ORDER BY gNo DESC") 


Это прекрасно работает для чтения файла и отображения данных, но не позволяет мне обновлять их с помощью:
rstGyles.Edit, .Update or .Addnew

Набор записей, по-видимому, создается в режиме только для чтения.
Я знаю, что ответ может заключаться в переходе к командам SQL insert и update, но я бы предпочел сначала исключить любую очевидную ошибку.

Что я уже пробовал:

Я пробовал использовать
'rstGyles.Open("SELECT * FROM bzGyle ORDER BY gNo DESC", conn3,, ADODB.LockTypeEnum.adLockOptimistic) 

Это дает мне ошибку 91 "ссылка на объект не установлена на экземпляр объекта".

Я также попытался запустить первый, потому что документы microsoft говорят, что блокировка должна быть установлена перед открытием набора записей:
rstGyles.LockType = ADODB.LockTypeEnum.adLockOptimistic 'tried in v3.0.4

но это приводит к тому же самому сообщению.

Gerry Schmitz

Ваш показ "фрагментов кода". Вы просите "полного решения" вместо ответа на вопрос. Никто не собирается писать это для вас.

eramm01

Я не ищу полного решения (я не вижу этих слов в своем вопросе) Я прошу совета или намека.

MadMyche

Есть ли какая-то конкретная причина, по которой вы остаетесь с кодом VB6ish вместо того, чтобы обратиться к сетевому провайдеру, такому как System.Data.Для oledb?

eramm01

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

Richard Deeming

Я согласен с Myche: если вы все равно переносите код, лучше использовать ADO.NET вместо давно умершего АДОДБА.

ADO.NET обзор | Microsoft Docs[^]

1 Ответов

Рейтинг:
1

CHill60

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

Тем не менее, попробуйте следующее, чтобы увидеть, если это поможет вам преодолеть свой горб..

1. я почти уверен, что именно тип блокировки генерирует ошибку, поэтому вместо того, чтобы ADODB.LockTypeEnum.adLockOptimistic, пробовать

rstGyles.LockType = adLockOptimistic
В качестве альтернативы попробуйте поставить ADODB.LockType. и посмотрите, что происходит с intellisense или с помощью
rstGyles.Open("SELECT * FROM bzGyle ORDER BY gNo DESC", conn3)
и убедитесь, что ошибка исчезла.

2. Попробуйте явно указать тип курсора как adOpenDynamic а не по умолчанию