0

我有这个代码:

$dbh = new PDO('odbc:MSSQLServer', 'user', 'pass');

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sth = $dbh->prepare($sql);

$sth->execute();

$result = $sth->fetch(PDO::FETCH_ASSOC);        

var_dump($result);

如果:

$sql = "select seri_cdser from tsica_alun_matr";

输出是:

array(1) {
    ["seri_cdser"]=>
    string(4) "3EMM"
}

但如果:

$sql = "select * from tsica_alun_matr";

输出是:

SQLSTATE[22003]: Numeric value out of range: 0 [Microsoft][SQL Server Native Client 11.0]Numeric value out of range (SQLFetchScroll[0] at /usr/local/src/PDO_ODBC/odbc_stmt.c:372)

有时也会返回一个空数组,显然驱动程序不稳定。

该表tsica_alun_matr有 13 列。

有人知道这是否是 MS SQL Server 的 PDO 驱动程序的错误?

4

2 回答 2

1

My connection string looks different when using PDO with MSSQL. Not sure if this will help but this is how I do it:

$c = new PDO("sqlsrv:Server=x.x.x.x;Database=db_name", "username", "password");

This might help with debugging too:

$c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
于 2013-08-31T19:37:26.000 回答
1

我在 PHP 文档中找到了一条评论:

http://php.net/manual/pt_BR/book.pdo.php

说的是:

  1. 我遇到的第二个错误是:

    致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[22003]:数值超出范围:0 [Microsoft][SQL Native Client]数值超出范围(ext\pdo_odbc\odbc_stmt.c 处的 SQLFetchScroll[0]: 372)' in (YOUR_TRACE_HERE) <<< 另一个无意义的错误“数值超出范围”...

-> 我实际上是“按原样”返回日期数据类型(datetime 或 smalldatetime),也就是说,在将其包含在结果集中之前没有将其转换为 varchar...我不知道 PDO 是否负责将其转换为PHP 数据类型,但它不是。在它到达 PHP 之前对其进行转换。

因此,作为存在datetimesmalldate字段,我已将我的 PDO 查询更改如下,将datetime和转换smalldatetimevarchar. 此页面有助于选择最佳转换格式。

$sth = $dbh->prepare("
    select
        alun_cdal,
        seri_cdser,
        CONVERT(VARCHAR(23), matp_dat_Mat, 121) as matp_dat_Mat,
        alun_nmal,
        alun_sexo,
        CONVERT(VARCHAR(23), alun_dnsc, 121) as alun_dnsc
    from 
        tsica_alun_matr");

现在我的代码工作正常!

于 2013-09-01T22:05:45.740 回答