Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?

Posted

技术标签:

【中文标题】Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?【英文标题】:Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server: How to insert/update BLOB varbinary(max) data? 【发布时间】:2021-09-27 06:09:44 【问题描述】:

SQL-Server 新手。我正在尝试使用以下(简化)代码通过 PERL/MS ODBC 驱动程序/DBD::ODBC 将 pdf 加载到 SQL-Server 表(数据类型 varbinary(max)):

use DBI qw(:sql_types);

open my $pdfFH, "test.pdf";
my @pdf = <$pdfFH>; close $pdfFH;
my $pdfStr = join('', @pdf);

my $dbh = <...valid db-handle ...>;
my $sth = $dbh->prepare(qq(
insert into 
    TestTable(Report)
values
    (?)));
$sth->bind_param(1,$pdfStr,DBI::SQL_VARBINARY);
$sth->execute;

错误:

DBD::ODBC::st bind_param failed: [Microsoft][ODBC Driver 17 for SQL Server]Invalid precision value (SQL-HY104) at ./t_sqlserver.pl line 37.
DBD::ODBC::st execute failed: [Microsoft][ODBC Driver 17 for SQL Server]COUNT field incorrect or syntax error (SQL-07002) at ./t_sqlserver.pl line 38.

我能够成功加载其他数据类型。另一种方法是使用 OPENROWSET(BULK...) 从文件系统本地加载 pdf,但我更喜欢直接加载以避免将文件从 Linux 移动到 Windows。

【问题讨论】:

完全不指定类型会不会失败?仅尝试 SQL_BINARY 会失败吗? 谢谢!它无需指定类型即可工作。我可以发誓我最初尝试过但没有成功。非常感谢! 【参考方案1】:

驱动程序应该足够聪明,能够在大多数情况下猜出正确的类型。尝试绑定参数而不指定类型。

【讨论】:

以上是关于Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Perl 调用 Informix 存储过程?

使用DBI将httpd24连接到Informix的Redhat

perl连接mysql数据库

RODBC 与 ms-access 错误 07002 17 [Microsoft][ODBC Microsoft Access Driver]COUNT 字段不正确

Linux中perl-DBI和DBI有啥区别?

已解决:DBI catch 语句消失且 CGI::Session 卡住