我的代码的目标是根据一个特定参数返回表中行数的计数。
以下是有效的代码:
######### 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跟踪日志,但遗憾的是,在将工作示例与失败的示例进行比较时,我无法获得任何有用的信息。
任何帮助都将不胜感激!!
谢谢,
答案 0 :(得分:3)
现在我们已经看到了可以解释这一点的痕迹。 DBD :: ODBC调用SQLDescribeCol并被告知:
DescribeCol column = 1,name =,namelen = 0,type = unknown(0),precision / column size = 10,scale = 0,nullable = 1 显示尺寸= 11
然后它调用SQLColAttribute并告知列大小为4.由于列类型未知(为什么驱动程序这样做我不确定)DBD :: ODBC决定将列绑定为char(4)并且所以一旦计数>它会溢出3位数。
这里使用的DBI和DBD :: ODBC的版本真的很旧,我怀疑最新版本会更好地应对这个问题。
答案 1 :(得分:2)
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;