请原谅我对Perl的无知,因为我是一名.NET开发人员(我可以听到你们所有人都在吐痰和诅咒;¬))
我们有一个要求是使用Perl脚本将一个BLOB(+一些其他数据)插入MS-SQL数据库(我们的后端系统使用Perl脚本在AIX上运行以进行日常业务)。
我们的Perl家伙,似乎遇到了一个问题:他可以插入到MS-SQL服务器中的最大BLOB(我们讨厌的.NETers使用)是64k但我们需要Perl脚本插入2MB的BLOB - 6MB
如果可以插入超过64k的BLOB;任何人都可以在调查途径上建议我们的Perl家伙可以为了达到这个目的而坚持下去吗?
很抱歉提出问题'通过代理',但我们的Perl大师正在度假。
提前致谢,
JD
答案 0 :(得分:2)
如果是DBI
,您可以将数据库句柄的最大缓冲区设置为所需的限制:
$dbh->{LongReadLen} = 10485760; # 10 MB
来自DBI
常见问题:
如何使用DBI处理BLOB数据?
使用DBI处理BLOB数据 非常直截了当。 BLOB专栏 在SELECT语句中指定为 按正常列。不过,你也是 需要指定最大BLOB大小 数据库句柄可以 使用LongReadLen属性获取。
例如:
### $dbh is a connected database handle $sth = $dbh->prepare( "SELECT blob_column FROM blobby_table" ); $sth->execute; would fail. ### $dbh is a connected database handle ### Set the maximum BLOB size... $dbh->{LongReadLen} = 16384; ### 16Kb...Not much of a BLOB! $sth = $dbh->prepare( "..." );
会成功没有列 值大于指定值 值的
如果BLOB数据长于 LongReadLen的值,然后是一个错误 会发生。但是,DBI提供 另外一项功能 这将自动截断 获取BLOB的大小 LongReadLen如果更长。这样做 不会导致错误发生,但可能 使你获取的BLOB数据毫无用处。
此行为受到 LongTruncOk属性是 默认设置为false值(因此 使超长BLOB提取失败)。
### Set BLOB handling such that it's 16Kb and can be truncated $dbh->{LongReadLen} = 16384; $dbh->{LongTruncOk} = 1;
BLOB数据的截断可能不是a 在BLOB的情况下大不了 包含行程编码数据,但是 最后包含校验和的数据, 例如,一个ZIP文件,将是 没用了。
答案 1 :(得分:0)
要插入BLOB,通常需要使用占位符。使用占位符准备语句,然后按如下方式绑定要插入的值:
$ statement-> bind_param(??,$ myvalue,DBI :: SQL_BLOB);
哪里??是占位符的位置,从1开始。然后像往常一样执行语句,例如:
$陈述书>执行();
与往常一样,错误处理是一个很好的计划。我们经常使用SQLite,但我很确定这对于MSSQL和MySQL也是正确的。