我的代码的目标是根据一个特定的参数返回表中的行数。
下面是可以工作的代码:
######### 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 SQL2005服务器上运行了跟踪,并且可以确认SQL语句正在正确运行,没有错误。
我已经查看了我的odbc跟踪日志,但不幸的是,在比较正在运行的示例和失败的示例时,我无法获得任何有用的信息。
任何帮助都将不胜感激!!
谢谢,
发布于 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版本非常旧,我怀疑最新的版本会更好地处理这个问题。
发布于 2013-04-03 23:20:47
Numeric value out of range是类型转换错误。TYPE应该是一个字符/字符串的数字吗?如果应该是数字,请使用数字
my $sth1 = $dbh->selectrow_array(
"select count(*) from TableInfo where Type=2") # Type=2, not Type='2'或者使用占位符,让Perl和数据库驱动程序担心类型转换
my $sth = $dbh->prepare("select count(*) from TableInfo where Type=?");
$sth->execute(2);
$sth->execute('2'); # same thing
my $st1 = $sth->fetchall_arrayref;https://stackoverflow.com/questions/15790899
复制相似问题