首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >select count(*) not working with perl DBI (不使用perl DBI

select count(*) not working with perl DBI (不使用perl DBI
EN

Stack Overflow用户
提问于 2013-04-03 22:58:44
回答 2查看 1.8K关注 0票数 2

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

下面是可以工作的代码:

代码语言:javascript
复制
######### 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)时,我得到了以下错误:

代码语言:javascript
复制
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 SQL2005服务器上运行了跟踪,并且可以确认SQL语句正在正确运行,没有错误。

我已经查看了我的odbc跟踪日志,但不幸的是,在比较正在运行的示例和失败的示例时,我无法获得任何有用的信息。

任何帮助都将不胜感激!!

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-04 00:43:55

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-04-03 23:20:47

Numeric value out of range是类型转换错误。TYPE应该是一个字符/字符串的数字吗?如果应该是数字,请使用数字

代码语言:javascript
复制
my $sth1 = $dbh->selectrow_array(
    "select count(*) from TableInfo where Type=2")  # Type=2, not Type='2'

或者使用占位符,让Perl和数据库驱动程序担心类型转换

代码语言:javascript
复制
my $sth = $dbh->prepare("select count(*) from TableInfo where Type=?");
$sth->execute(2);
$sth->execute('2');     # same thing
my $st1 = $sth->fetchall_arrayref;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15790899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档