Perl DBI Sybase Asanywhere 绑定变量问题

Posted

技术标签:

【中文标题】Perl DBI Sybase Asanywhere 绑定变量问题【英文标题】:Perl DBI Sybase Asanywhere Problems with bind variables 【发布时间】:2017-05-22 12:57:49 【问题描述】:

我必须将我的网络服务器(仅供内部使用)切换到更新的版本,所以我还有新的 perl 和新的 DBD:Sybase,而不是我以前使用的 DBD:ASny。

我经常使用带有绑定变量的语句,它们运行良好,但使用 DBD:Sybase 我得到以下错误:

AH01215:DBD::Sybase::st 执行失败:服务器>消息编号=12006 严重性=16 状态=0 行=0 文本=SQL Anywhere-Fehler >-110:元素 'DBD1' ist bereits vorhanden

版本:

新:DBD::Sybase

/usr/local/lib/x86_64-linux-gnu/perl/5.22.1/DBD/Sybase.pm 已安装:1.15

旧:DBD::ASany

DBD::ASany 1.14 版。

#!/usr/bin/perl 

use DBI;
print "Content-type: text/html\n\n";

$dbh = DBI->connect( "DBI:Sybase:server=tl", 'xxx', 'yyy', PrintError => 1, AutoCommit => 0 ) or die "Connection failed\n    Connection string: $connstr\n    Error message    : $DBI::errstr\n";

$dbh2 = DBI->connect( "DBI:Sybase:server=tl", 'xxx', 'yyy', PrintError => 1, AutoCommit => 0 ) or die "Connection failed\n    Connection string: $connstr\n    Error message    : $DBI::errstr\n";

$select="select artnr, bez1, bez2 from art where artnr like 'F%12%.00'";
$sth_t=$dbh->prepare($select);
$sth_t->execute();

$select="select lager_nr, bestand from bestand where art_nr = ? and coalesce(bestand,0) > 0 ";
$sth_lager=$dbh2->prepare($select)  or die "Prep sthlager nix:".$dbh2->errstr()."\n";

while ( ($artnr, $gtnr, $bez)=$sth_t->fetchrow())

    print $artnr."; ".$gtnr."; ".$bez;
    $sth_lager->execute($artnr)   or die "exec sthlager nix:".$dbh2->errstr()."\n";
    while ( ($lager,$bestand) = $sth_lager->fetchrow())
    
        print $lager." : ".$bestand." || ";
    
    $sth_lager->finish();
    print "\n<br>";

违规行是“$sth_lager->execute($artnr)”

【问题讨论】:

错误信息是德语的?是司机送的吗? 如果您知道哪些模块适合您,有什么理由不能直接安装这些模块的版本吗?如果它们不在 CPAN 上,它们可能在 BackPAN 上,因此您应该能够获取它们,然后使用 local::lib 安装它们。 "Element 'DBD1' ist bereits vorhanden" 您确定错误来自您向我们展示的代码吗?该错误表示“元素'DBD1'已经存在”并且在您尝试插入违反表上唯一索引的行时生成。这似乎不太可能由 select 语句生成。 我不是说这是个问题,但我不喜欢用来准备>执行的方法。你能试试my $select = $dbh-&gt;prepare("select artnr, bez1, bez2 from art where artnr like 'F%12%.00'"); $select-&gt;execute || die "failed to execute"; 也打开use strict; use warnings; 我也完全同意@DaveCross。如果您使用 select 语句,您的错误似乎告诉您它正在尝试创建一些不真实的东西。 对不起:错误信息在我的 apache2/error.log 中。 @simbabque:据我所知 DBD:ASAny 已被弃用,而且安装起来总是很麻烦,我很高兴有别的东西。 【参考方案1】:

感谢大家,尤其是 simbabque,他走在了正确的轨道上。答案很简单: DBD::ASAny 用于处理 SQL Anywhere,而 DBD::Sybase 用于 Sybase Adaptive Server Enterprise,这两个系统实际上完全不同。 我使用了错误的工具。雾。

【讨论】:

以上是关于Perl DBI Sybase Asanywhere 绑定变量问题的主要内容,如果未能解决你的问题,请参考以下文章

perl / sql server查询“重新排序”

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

在 Windows-7-x64 上使用 DBI Perl 和 MySql 的未定义 $DBI::errstr

Perl/DBI/FreeTDS/SQLAzure 一些插入被忽略

Perl 执行 DBI 循环执行

perl 中的 DBD::Oracle 和 DBI 错误