2014-10-16 5 views
0

나는 잠시 동안 내 머리를 두드렸다. 나는 Ubuntu 14.04 64bitPHP 5.5.9-1ubuntu4.4 (cli)을 가지고 있고 apt-get을 통해 php5-odbc을 설치했으며, freeTDSunixODBC도 설치했습니다.PHP PDO unixODBC FreeTDS SQL Server '저장 프로 시저에서 데이터 유형 varchar (max)를 datetime으로 변환'

다음과 같이 나는 PARAMS을 결합하여 저장 프로 시저를 호출하려고 시도하고있다 :

결과
<?php 

$dbh = new PDO('odbc:myDBSERVER', "username", ""); 

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

function writestp($dbh){ 
    $dbh->beginTransaction(); 

    $sql = " EXEC 
    stp_Update_Job 
    :Job_ID, 
    :Modify_Date 
    "; 
    $sth = $dbh->prepare($sql); 

    $params = array(
     ":Job_ID"      => 123456, 
     ":Modify_Date"     => date(DateTime::ISO8601) 
    ); 

    try{ 
     $sth->execute($params); 
    }catch(Exception $e){ 
     echo $e->getMessage(); 
    } 

    $dbh->rollback(); 
} 

writestp($dbh); 

?> 

:

SQLSTATE[42000]: Syntax error or access violation: 8114 [FreeTDS][SQL Server]Error converting data type varchar(max) to datetime. (SQLExecute[8114] at /build/buildd/php5-5.5.9+dfsg/ext/pdo_odbc/odbc_stmt.c:254)[Finished in 0.1s]

UPDATE이 그것을 해결

$params = array(
     ":Job_ID"      => 123456, 
     ":Modify_Date"     => date("Y-m-d\TH:i:s") 
    ); 

endUpdate 메소드는 :

내 저장된 프로 시저는 다음과 같이 시작합니다

CREATE PROCEDURE [dbo].[stp_Update_Job] 
       @Job_ID       int, 
       @Modify_Date     datetime 

구성 파일을 다음과 같이

/etc/odbinst.ini

[FreeTDS] 
Description = Free TDS driver 
# Driver on Ubuntu 64 bit 
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so 
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 

/etc/odbc.ini

# set a DSN 
[myDBSERVER] # you can now refer to this connection 
        # by this name when connecting via odbc. 

# Some info about the connection 
Description = Connection to myDBSERVER 

# name of the odbc driver to use as specified in /etc/odbcinst.ini 
Driver  = FreeTDS 

# Database name to connect to 
Database = myDBName 

# Server name as specified in /etc/freetds/freetds.conf 
ServerName = myDBSERVER 
TDS_Version = 7.2 

/etc/freetds/freetds.conf

[myDBSERVER] 
    host = myDBSERVERHOST 
    port = 1433 
    tds version = 7.2 
    client charset = UTF-8 

답변

1

그것은 ISO8601 제안이 페이지에도 불구하고 지원 날짜 시간 형식입니다 실현하는 것은 매우 실망, 사실, 날짜에 시간대 부분은 지원되지 않습니다.

내가 내부적으로 date(DateTime::ISO8601)을 사용했다

http://msdn.microsoft.com/en-us/library/ms187819.aspx

, 이것은 PHP 날짜 형식 문자열을 사용 "Y-m-d\TH:i:sO".

대신 "Y-m-d\TH:i:s"을 사용하면이 문제를 해결할 수 있습니다.