sql - select count(*) 不适用于 perl DBI

标签 sql perl odbc dbi

我的代码的目标是根据一个特定参数返回表中的行数。

这是有效的代码:

######### SQL Commands
### Connect to the SQL Database
my $dbh = DBI->connect($data_source, $user, $pass)
    or die "Can't connect to $data_source: $DBI::errstr";

### Prepare the SQL statement and execute
my $sth1 = $dbh->selectrow_array("select count(*) from TableInfo where Type = '2'")
or die "Can't connect to $data_source: $DBI::errstr";

### Disconnect from Database statements are completed.
$dbh->disconnect;
######### end SQL Commands 


print $sth1;

这将成功打印一个数字,在本例中为 189。 当我尝试使用相同的代码但更改“Type = '2'”(应返回值 2000)时,出现以下错误:

DBD::ODBC::db selectrow_array failed: [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range (SQL-22003) at ./getTotalExpSRP.cgi line 33, <DATA> line 225.
Can't connect to dbi:ODBC:BLTSS_SRP: [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range (SQL-22003) at ./getTotalExpSRP.cgi line 33, <DATA> line 225.

我到处搜索,但找不到为什么会发生这种情况。 从问题的症状来看,我猜测返回的结果的大小是有限制的,但我找不到任何支持证据。

我已经在 Microsoft SQL 2005 服务器上运行了跟踪,并且可以确认 sql 语句正在正确运行,没有错误。

我已经查看了 odbc 跟踪日志,但不幸的是,在将工作示例与失败示例进行比较时,我无法得出任何有用的信息。

如有任何帮助,我们将不胜感激!!

谢谢

最佳答案

现在我们已经看到了我可以解释这一点的痕迹。 DBD::ODBC 调用 SQLDescribeCol 并被告知:

DescribeCol 列 = 1、名称 = 、namelen = 0、类型 = 未知 (0)、精度/列大小 = 10、小数位数 = 0、可空 = 1 显示尺寸 = 11

然后它调用 SQLColAttribute 并被告知列大小为 4。由于列类型未知(我不确定驱动程序为何这样做),DBD::ODBC 决定将该列绑定(bind)为 char(4) 并因此,一旦计数 > 3 位,它就会溢出。

这里使用的 DBI 和 DBD::ODBC 版本确实很旧,我怀疑最新版本会更好地处理这个问题。

关于sql - select count(*) 不适用于 perl DBI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15790899/

相关文章:

mysql - 插入到由 MySQL 后端中的两个表构建的具有一对一关系的 MS Access 查询中?

mysql - perl - 如果列词丢失则插入值

c# - 连接未打开

mysql - 一些连接插入到同一个表外键

regex - 下面的捕获组符号对 Perl 有什么意义吗

windows - Perl 脚本引发 oci.dll 错误,DBD

SQL-我如何使用窗口函数跨分区进行乘积/乘法

perl - 在 Perl + EOF 处理中将位写入(和读取)二进制文件

php - Access ODBC : Wrong value returned for numeric (integer) fields

excel - 是否可以将 Sqlite 数据库嵌入到 excel 2007 文件(zip 存档)中