【问题标题】:Fail on update a mediumblob value in MariaDB database更新 MariaDB 数据库中的 mediumblob 值失败
【发布时间】:2020-07-24 07:18:29
【问题描述】:

我正在使用带有 MS Access 前端的服务器端的 MariaDB 数据库。我尝试使用以下结构在我的数据库中的 nomappdata 表中上传一个二进制文件:

ID int(11)
appCode 中blob

用于上传的函数是:

Function saveFileToDB(ID As Long, fName As String)

Dim myConn As New ADODB.connection
Dim rsADO As New ADODB.Recordset
Dim st As New ADODB.Stream

On Error Resume Next

strSQL = "SELECT nomappdata.* FROM nomappdata WHERE ID = " & ID

With myConn
    .ConnectionString = getConnStrMySQL("N")
    .Open
End With

If myConn.Errors.Count = 0 Then

    With rsADO
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .ActiveConnection = myConn
        .Open strSQL

    End With
    
    With st
        .Type = adTypeBinary
        .Open
        .LoadFromFile fName
    End With
    
    With rsADO
        .Fields("appCode").Value = st.Read
        .Update
    End With

End If

st.Close
Set st = Nothing
rsADO.Close
Set rsADO = Nothing
myConn.Close
Set myConn = Nothing
End Function

我尝试上传的测试文件大小约为 73 kByte。

连接有效(状态 = 1)

流对象加载文件数据(已测试)

记录集被读取(测试)

该脚本适用于大小小于 64 kBytes 的文件,但我需要在更新之前删除以前的值,因为如果没有,则更新不起作用。

我的问题是当调试提示到达“.Update”行时,访问等待一段时间然后意外崩溃。 我该如何解决这个问题?

我正在使用以下软件:

Microsoft Access for Microsoft 365 MSO (16.0.13001.20338) 64 位 MariaDB 10.1.40-MariaDB mariadb-connector-odbc-3.1.9-win64

# The MySQL server
[mysqld]
port= 3306
socket = "D:/xampp/mysql/mysql.sock"
basedir = "D:/xampp/mysql" 
tmpdir = "D:/xampp/tmp" 
datadir = "D:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 16M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"

修改(工作)代码:

Dim fileData() As Byte

With st
    .Type = adTypeBinary
    .Open
    .LoadFromFile fName
End With


With rsADO
    .CursorLocation = adUseClient
    .CursorType = adOpenStatic
    .LockType = adLockOptimistic
    .ActiveConnection = myConn
    .Open strSQL
    .Fields("appCode").Value = st.Read
    .Update
    .Close
End With

【问题讨论】:

  • 崩溃是否意味着存在服务器和/或应用程序错误?哪个)?在更新较大的文件/blob 时,增加 mariadb 服务器设置 max_allowed_pa​​cket 听起来像是一个预先准备好的事情。
  • MS Access 应用程序崩溃。我把这个改成16777216(16M)但是情况还是一样。
  • On Error Resmue Next 在函数之上是邪恶的(只隐藏错误,应该解决)并避免 Auto-assigned objects(Dim obj as New Object)

标签: mysql ms-access mariadb ado


【解决方案1】:

似乎是“MariaDB ODBC 3.1 驱动程序”中的一个错误 (ODBC-251)。

改用“MySQL/ODBC 连接器 8.0.19”(或更新版本)!

替代方案:

  1. 使用LOAD_FILE函数
  2. 将数据存储在文件系统中,并且只将路径存储在 db 中。

【讨论】:

  • 感谢 ComputerVersteher 的回答。我知道 Resume Next 语句中的“邪恶”,在原始代码中,为了简单起见,我已经包含了一个错误处理部分,它没有包含在上面的代码中,但不幸的是没有显示任何与我的问题相关的内容。我照顾了 max_text_repl_size (或类似的东西),但在我的服务器变量中没有找到任何东西。我也尝试过你建议的修改,但情况没有改变。
  • max_allowed_packet应该是正确的设置。更改后您重新启动了 MariaDB?显示(有问题的)MS-Access 的应用程序版本。 MariaDB、操作系统和 ODBC 驱动程序!同时显示 MariaDB 配置文件的相关部分。
  • 您好@ComputerVersteher,在我更改了max_allowed_pa​​cket 后,我​​重新启动了MariaDB 服务器。我在我的问题中附上了上面的版本信息和 my.ini 配置文件的一部分。
  • 抱歉 ComputerVersteher 粗心,我将尝试建议的选项并返回结果。谢谢!
  • 最后经过一些修改,我的代码开始工作了!感谢您的解决方案和您的时间。我使用带有以下连接字符串的 {MYSQL ODBC 8.0 ANSI Driver}:DRIVER={MYSQL ODBC 8.0 ANSI Driver};数据库=mydb; UID=我的用户; PWD=mypasswd;SERVER=myserver;OPTION=67108922;CONN_TIMEOUT=5;Persist Security Info=true
猜你喜欢
  • 2019-03-17
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多