2016-11-29 7 views
0

Я использую 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 
+0

Правильно ли он работает, если вы установили местоположение курсора Connection/Recordset в 'adUseClient' вместо' adUserServer'? – grudolf

+0

Это ужасно медленно (ожидается, поскольку он возвращает всю базу данных обратно с использованием существующих запросов в программе), однако она действительно работает. Я пойду с этим подходом и оптимизирую запросы, чтобы возвращать только полезные данные. Если вы ответите, я соглашусь. Приветствия. – rolls

+0

Положительная сторона будет меньше работы, если в будущем приложение будет перенесено в ADO.NET. ;) – grudolf

ответ

1

Реализация курсора на стороне сервера, по-видимому, ограничена, вместо этого используйте курсоры на стороне клиента (DB.CursorLocation = adUseClient).

-1

1.) Вы не можете сделать обновление в SQL с помощью Select-Заявлении. Вместо этого используйте UPDATE-Statement. 2.) Не пытайтесь обновить все записи. Обновите только одну строку, которую хотите обновить. Когда вы пишете, это должна быть последняя запись.

Вы обновляете тестовое поле, и вы должны быть достаточно конкретными в WHERE-Clause, что вы выбираете только одну и только запись, которую хотите обновить.

+0

Я думал, что оператор SQL просто должен получить данные в первую очередь. Нужно ли снова подключаться к оператору обновления после изменения набора записей? – rolls

+0

http://www.accessallinone.com/updating-adding-and-deleting-records-in-a-recordset/ В этом примере вы можете обновить запись, используя команду SQL SELECT. Набор записей ADODB должен автоматически создавать инструкцию обновления SQL. Почему этот пример работает, но мой нет? Я бы предпочел не переписывать всю программу, которая ранее использовала только команды select и вызывало обновление. Я редактировал, чтобы показать пример этого. – rolls

+0

Даже если я использую SELECT и выбираю только одну запись, он все равно дает мне ту же ошибку. Я считаю, что ошибка не является оператором select, а чем-то другим. – rolls