【问题标题】:How to copy BLOB fields/records from one DB to another with MySql and Classic ASP如何使用 MySql 和 Classic ASP 将 BLOB 字段/记录从一个数据库复制到另一个数据库
【发布时间】:2017-01-05 07:35:41
【问题描述】:

我有以下问题:

我在 2 个不同的服务器上有 2 个 MySql DB,每个服务器都有一个表,每个表都有相同的表结构。这些 DBs 表在每条记录(WAV 格式的语音记录)中都有许多 BLOB 字段,外加一个数字记录 ID。

我使用的是经典的 ASP (VB),并且无法更改,因为整个系统都是经典的 asp(此外,我还不知道另一种语言/系统)。我知道它很旧,但现在需要解决这个问题。

我需要从 DB1 读取某条记录(假设 IdNum=100 的记录),包含完整数据(包括 BLOB 字段)......并将相同的完整记录保存(插入)到 DB2 表中(包括 BLOB字段)。

我尝试正常插入,但在 sqlRec2 声明行中出现“类型不匹配”错误。

任何人都可以帮助我如何做到这一点?谢谢!!

我的代码如下(recwav01、02、03是BLOB字段,“notes”是txt字段):

Set my_conn = createobject("ADODB.Connection")
Set my_conn2 = createobject("ADODB.Connection")

my_conn.open = "DRIVER={MySQL ODBC 5.3 Unicode Driver};"_
& "SERVER=yyy.yyy.yyy.yyy;PORT=3306;"_
& "DATABASE=dbremote01;"_
& "UID=root;PWD=password01; OPTION=35;"

my_conn2.open = "DRIVER={MySQL ODBC 5.3 Unicode Driver};"_
& "SERVER=xxx.xxx.xxx.xxx;PORT=3306;"_
& "DATABASE=dbremote02;"_
& "UID=root;PWD=password02; OPTION=35;"

sqlRec = "SELECT * FROM table01 WHERE idnum>=100 AND idnum <=120;"
Set rs = my_conn.Execute(sqlRec)

DO WHILE NOT rs.EOF
  sqlRec2 = "INSERT INTO table02 (idnum,notes,recwav01,recwav02,recwav03) VALUES (" & _
  rs("idnum") & ", '" & rs("notes") & "', '" & rs("recwav01") & "', '" & rs("recwav02") & _
  "', '" & rs("recwav03") & "');"
  my_conn2.Execute(sqlRec2)
  rs.movenext
LOOP

【问题讨论】:

标签: mysql asp-classic blob


【解决方案1】:

是的!你有一个难题。 21 世纪的语言和运行时很难处理大型 BLOB;他们通常需要某种流协议将它们从服务器传输到程序 RAM。而且您正在处理多年未更新的 20 世纪后期运行时。根据 BLOB 的大小,经典 ASP 问题的答案可能是You Can't Do That™

与此同时,您可以尝试使用 Base 64 编码将二进制内容转换为文本字符串。这对 SQL 语句可能会解决问题。

阅读您的表格:

 sql1 = "SELECT  idnum, notes, TO_BASE64(recwav01) w1, TO_BASE64(recwav02) w2, TO_BASE64(recwav03) w3; "

然后,插入行,这样的语句。

sql2 = _
"INSERT INTO table02 (idnum, notes, recwav01, recwav02, recwav03) " & _
   "VALUES (" & rs("idnum") & ", '" & rs("notes") & "', " & _
            "FROM_BASE64('" &  rs("w1") & "'), " & _
            "FROM_BASE64('" &  rs("w2") & "'), " & _
            "FROM_BASE64('" &  rs("w3") & "')); " 

(不保证此连接文本字符串的正确性。警告,如果您的任何 notes 列值包含 ' 字符,则此炸毁你的脸。)

这里的想法是在从 DBMS 输入的过程中将二进制数据转换为文本字符串,并在输出时将这些字符串转换回二进制。

如果事实证明这不起作用,因为 BLOB 对于经典 asp 来说太大了,您可以尝试使用 mysqldump 将数据提取到文本文件,然后将其加载到新数据库中。

【讨论】:

  • 我正在研究第二个选项。我在第一个 DB 上使用 mysqldump 将每个 BLOB 字段保存到本地文件中,然后将每个保存的文件插入到第二个 DB 上的新记录中。第一部分工作正常。我可以保存文件并且它们是正确的(可以收听保存的 wav)。问题是我无法将它们保存到第二个数据库中......我在插入中使用了以下命令: INSERT INTO table2(idnum, note,recwav01,recwav02) VALUES(100,NULL,LOAD_FILE('c:/tempdir /recfile01.wav'), LOAD_FILE('c:/tempdir/recfile02.wav')); ...它创建记录,但不保存 BLOB,BLOB 字段为空。
  • 一大堆....这个答案在兜售!我已将 WAV 文件作为 blob 存储在 SQL Server 数据库中,并使用ADODB.Stream 检索它们,这是完全可行的。
  • 成功了!!仅供大家了解:使用时 load_file('c:/path/File.xxx');您正在加载的文件必须位于运行 sql 实例的机器上(即远程服务器)。还要注意在my.ini(mysql配置文件)中设置:max_allowed_pa​​cket=100M。 ;)
  • @Lawrence 虽然这会奏效,但工作量很大,但收获不多。您想尝试stackoverflow.com/a/5018462/692942 之类的东西,而不是LoadFromFile(),只需将其指向数据库即可。无需在服务器上存储文件,这既麻烦又不必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多