Я использую MariaDB и VBA для чтения/записи плоской базы данных с помощью ADODB. Это не по выбору, но меня попросили заставить его работать таким образом. Альтернативой было бы прямое использование SQL-запросов, однако это порт очень старого приложения VB3.VBA - MariaDB - запрос не может быть обновлен, поскольку он не содержит столбцов поиска, которые можно использовать в качестве ключа
Вот мой код, который подключается к базе данных, отодвигается все записи, обновляет последнюю запись, а затем вызывает обновление эффективно записать его обратно в базу данных
Global DB As New ADODB.Connection
Global TD As New ADODB.Recordset
DB.Open "Driver={MariaDB ODBC 2.0 Driver};Server=localhost;UID=???;PWD=???;DB=sf_log;Port=3306"
Dim query As String: query = "SELECT * FROM `" & TableName & "` ORDER BY `Record ID`"
TD.CursorLocation = adUseServer
TD.CursorType = adOpenDynamic
TD.Open query, DB, adOpenKeyset, adLockOptimistic
TD.MoveLast
Dim TestColumnField as string
TestColumnField = TD.Fields("TestColumn") 'This returns the correct value from the database indicating the connection was successful
TD.Fields("TestColumn") = "test"
TD.UpdateBatch (adAffectCurrent) ' This line throws the error
об ошибке, сообщаются в «Запрос не может обновляться, потому что он не содержит столбцов с возможностью поиска в качестве ключа «
База данных представляет собой плоскую беззатратную базу данных без ключей. Я попробовал установить «record id» как первичный ключ без везения.
Эта ошибка связана с тем, что MariaDB не реализует/поддерживает ADODB-рекомпрессор? Это связано с моей структурой базы данных? Или это просто я неправильно использую ADODB recorset?
Редактировать: Вот пример, который показывает, что вам не требуется инструкция по обновлению SQL. Вы можете просто выбрать данные и вызвать «Обновить».
http://www.accessallinone.com/updating-adding-and-deleting-records-in-a-recordset/
Sub ADODBUpdating()
Dim sql As String
Dim rs As adodb.Recordset
sql = "SELECT * FROM tblTeachers WHERE TeacherID=5"
Set rs = New adodb.Recordset
rs.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
'Open RecordSet
With rs
If Not .BOF And Not .EOF Then
.MoveLast
If .Supports(adUpdate) Then
![FirstName] = "x" & ![FirstName]
.Update
End If
End If
.Close
End With
Правильно ли он работает, если вы установили местоположение курсора Connection/Recordset в 'adUseClient' вместо' adUserServer'? – grudolf
Это ужасно медленно (ожидается, поскольку он возвращает всю базу данных обратно с использованием существующих запросов в программе), однако она действительно работает. Я пойду с этим подходом и оптимизирую запросы, чтобы возвращать только полезные данные. Если вы ответите, я соглашусь. Приветствия. – rolls
Положительная сторона будет меньше работы, если в будущем приложение будет перенесено в ADO.NET. ;) – grudolf