VBA - MariaDB - 无法更新查询,因为它不包含用作键的可搜索列
VBA - MariaDB - Query cannot be updated because it contains no searchable columns to use as a key
我正在使用 MariaDB,VBA 到 read/write 使用 ADODB 的平面数据库。这不是我的选择,但是我被要求以这种方式工作。另一种方法是直接使用 SQL 查询,但这是一个非常古老的 VB3 应用程序的端口。
这是我连接到数据库的代码,提取所有记录,更新最后一条记录,然后调用 update 有效地将其写回数据库
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
报告的错误是 "Query cannot be updated because it contains no searchable columns to use as a key"
该数据库是一个没有键的平面无关系数据库。我试过将 "record id" 设置为主键,但没有成功。
这个错误是由于 MariaDB 而不是 implementing/supporting ADODB recorset?是因为我的数据库结构吗?还是我只是错误地使用了 ADODB 记录集?
编辑:这是一个示例,表明您不需要 SQL 更新语句。您可以简单地 select 数据并调用更新。
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
1.) 您不能使用 SELECT-语句在 SQL 中进行更新。而是使用更新语句。
2.) 不要尝试更新所有记录。仅更新您要更新的单行。正如您所写,这应该是最后一条记录。
您更新了测试字段并且您必须在 WHERE 子句中足够具体,您只 select 您想要更新的唯一记录。
服务器端游标实施似乎受到限制,请改用客户端游标 (DB.CursorLocation = adUseClient
)。
我正在使用 MariaDB,VBA 到 read/write 使用 ADODB 的平面数据库。这不是我的选择,但是我被要求以这种方式工作。另一种方法是直接使用 SQL 查询,但这是一个非常古老的 VB3 应用程序的端口。
这是我连接到数据库的代码,提取所有记录,更新最后一条记录,然后调用 update 有效地将其写回数据库
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
报告的错误是 "Query cannot be updated because it contains no searchable columns to use as a key"
该数据库是一个没有键的平面无关系数据库。我试过将 "record id" 设置为主键,但没有成功。
这个错误是由于 MariaDB 而不是 implementing/supporting ADODB recorset?是因为我的数据库结构吗?还是我只是错误地使用了 ADODB 记录集?
编辑:这是一个示例,表明您不需要 SQL 更新语句。您可以简单地 select 数据并调用更新。
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
1.) 您不能使用 SELECT-语句在 SQL 中进行更新。而是使用更新语句。 2.) 不要尝试更新所有记录。仅更新您要更新的单行。正如您所写,这应该是最后一条记录。
您更新了测试字段并且您必须在 WHERE 子句中足够具体,您只 select 您想要更新的唯一记录。
服务器端游标实施似乎受到限制,请改用客户端游标 (DB.CursorLocation = adUseClient
)。