2

私のコードの目標は、1 つの特定のパラメーターに基づいて、テーブル内の行数のカウントを返すことです。

動作するコードは次のとおりです。

######### 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 トレース ログを確認しましたが、残念ながら、実際の例と失敗した例を比較しても、有用な情報を得ることができません。

どんな助けでも大歓迎です!!

ありがとう、

4

2 に答える 2

3

これで説明できる痕跡が見えてきました。DBD::ODBC が SQLDescribeCol を呼び出し、次のように通知されます。

DescribeCol 列 = 1、名前 = 、namelen = 0、型 = 不明(0)、精度/列サイズ = 10、スケール = 0、nullable = 1 表示サイズ = 11

次に、SQLColAttribute を呼び出し、列のサイズが 4 であると通知されます。列の型が不明だったので (なぜドライバーがそうしたのかわかりません)、DBD::ODBC は列を char(4) としてバインドすることを決定します。カウントが 3 桁を超えると、オーバーフローします。

ここで使用されている DBI と DBD::ODBC のバージョンは非常に古いため、最新バージョンの方がこれにうまく対処できると思います。

于 2013-04-03T16:43:55.400 に答える
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;
于 2013-04-03T15:20:46.570 に答える