【问题标题】:What causes DBD::ODBC::st fetchrow_array failed: st_fetch/SQLFetch and how to avoid it?是什么导致 DBD::ODBC::st fetchrow_array 失败:st_fetch/SQLFetch 以及如何避免它?
【发布时间】:2016-04-11 02:31:07
【问题描述】:

编辑1:

我实际上并没有得到如下所述的空数组。相反,由于以下异常,我得到了一个空的响应正文:

DBD::ODBC::st fetchrow_array failed: st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not set and/or LongReadLen too small) (SQL-HY000) [state was HY000 now 01004]

我可以看到有关于的帖子。我会看看那些,看看我能不能在我的身上解决这个问题。如果不成功将编辑。


首先让我先说,我一点也不了解 Perl。这可能是一个粗心的错误——我希望是这样。我正在从一个从 SQL 或前端的 JavaScript 返回的数组和哈希中的一个键构建一个哈希,“short-desc”需要具有下面代码中将来自的值SQL 数据库。

BFHHOTH 15x24S/S +2 UP-HNDWHL-UNSPOKED-GALV 15"x24" flush escape hatch w/hinge, internal handwheel, T-handle on top steel cover and ring

但是使用代码(从开关中删除了不必要的情况):

#!perl
use Switch;
use DBI;
use JSON;
use CGI qw /param/;
use CGI::Carp qw(fatalsToBrowser);
use IO::Compress::Gzip qw(gzip $GzipError);
use URI::Encode;
use URI::Escape;

my $gzip_ok;

my $accept_encoding = $ENV{HTTP_ACCEPT_ENCODING};
if ( $accept_encoding && $accept_encoding =~ /\bgzip\b/ ) {
 # $gzip_ok = 1;
}
print "Content-Type: application/json\n";
if ($gzip_ok) {
    print "Content-Encoding: gzip\n";
}
print "\n";

my $action = param('ACTION');

my %jsonData;
my @jsonArray;

my $azDSN = DBI->connect('dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=myServer;Database=myDB;Uid=me;Pwd={myPass};Encrypt=yes;Connection Timeout=30;');

switch ($action) {
 case "GETINFO" {
    my $paramID = param('ID');
    getInfo($paramID);
     my $json_text = JSON->new->pretty->utf8->encode( \@jsonArray );
    if ($gzip_ok) {
        my $zipText;
        gzip \$json_text, \$zipText,
            or die "gzip failed: $GzipError\n";
        print $zipText;
    }
    else {
        print $json_text;
    }
  }
}

sub getInfo {
 my $myID = $_[0];
 my $statement = <<"SQL";
   SELECT
     trefQuoteItemsID,
     quote_position,
     description,
     comments
   FROM
     myDB.dbo.myTable where tID = $myID;
 SQL
 my $sti = $azDSN->prepare($statement) or die $statement;
 $sti->execute() or die $DBI::errstr;
 while ( my @row = $sti->fetchrow_array ) {
     my %tempData;

     %tempData = (
         "tref"                      => $row[0],
         "position"                  => $row[1],
         "short_desc"                => $row[2],
         "comments"                  => $row[3]
     );
     $jsonArray[$count] = {%tempData};
     $count++;
 }
}

一个空数组在前端返回给我。

奇怪的是,如果字符串是:

BFHHOTH 15x24S/S +2 UP-HNDWHL-UNSPOKED-

数组包含正确的对象。 但如果字符串为空,则再次为空:

BFHHOTH 15x24S/S +2 UP-HNDWHL-UNSPOKED-G

也尝试过使用字符串:

qwertyuiopasdfghjklzxcvbnm1234567890qwe  #length is 39

让哈希被构建并且:

qwertyuiopasdfghjklzxcvbnm1234567890qwer #length is 40

这将返回一个空数组,因此不会构建哈希。

有没有 Perl 大师有什么建议?

【问题讨论】:

  • 请提供一个最小的、可运行的问题演示。
  • 这里是创建minimal reproducible example的方法。
  • @ikegami 正在处理这个问题,对此感到抱歉
  • 你肯定需要阅读bobby-tables.com来了解SQL注入
  • @glennjackman 谢谢,sql 新手,这是我从别人那里继承的工作,所以代码不是真正的“我的”,所以我一直担心这样的问题。感谢您的建议

标签: arrays json perl hash


【解决方案1】:

据我所知,它与“长对象”列有关。

DBD::ODBC 说:

您可以像这样以块的形式检索 lob:

$sth->bind_col($column, undef, {TreatAsLOB=>1});
while(my $retrieved = $sth->odbc_lob_read($column, \my $data, $length)) {
    print "retrieved=$retrieved lob_data=$data\n";
}

注意:要检索这样的 lob,您必须首先绑定指定 BindAsLOB 或 DBD::ODBC 的 lob 列,将 1) 正常绑定该列,它将受到 LongReadLen 和 b) odbc_lob_read 失败。

注意:某些数据库引擎和 ODBC 驱动程序不允许您无序检索列(例如 MS SQL Server,除非您使用游标)。在这些情况下,您必须确保检索到的 lob 是选择列表中的最后(或唯一)列。

注意:您只能检索 lob 的一部分,但在对该语句执行任何其他操作之前,您可能必须在语句句柄上调用完成。当仅检索大 lob 的一部分时,您可能会在调用完成时看到一个小的延迟,因为 ODBC 驱动程序使用的某些协议将 lob 同步发送到套接字并且无法停止它(这意味着 ODBC 驱动程序需要读取所有来自套接字的 lob,即使您从未自己检索过它)。

注意:如果您的选择包含多个 lob,您无法读取第一个 lob 的一部分,则第二个 lob 然后返回到第一个 lob。您必须按顺序完整读取所有 lob,或者读取部分 lob,然后不再调用 odbc_lob_read。

没有提及是否可以通过任何其他方式检索 lob,所以我不知道您是否必须这样做,但至少您知道一种方式。但我相信你可以通过增加连接的LongReadLen 属性来解决这个问题。

你应该可以如下设置属性:

my $dbh = DBI->connect($dsn, $user, $passwd, {
   ...,
   LongReadLen => ...,
});

您还应该能够按如下方式设置属性:

$dbh->{LongReadLen} = ...;

希望有人能给你一个更好的答案。

【讨论】:

  • 是的,我通过将 LongReadLen 值添加到数据库处理程序来使其工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2020-09-23
  • 2013-09-19
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多