2016-05-03 16 views
0

Ich versuche, ein paar Zeilen in eine MSSQL-Server-Datenbank über Zend \ Db-Komponente einzufügen. Einige Felder enthalten Datumsangaben im deutschen Format, also TT.MM.JJJJ, aber SQL Server erwartet JJJJ-MM-TT. Es gibt die Option SET DATEFORMAT DMY, die mein Problem über SQL Management Studio löst. Aber in PHP und mit Zend \ Db muss ich diese Anweisung vor jede INSERT-Anweisung setzen. Keine Ahnung warum? Gibt es keine Möglichkeit, dies für eine ganze Sitzung festzulegen?Zend Db benötigt dateformat für jede einfügen Abfrage

Beispiel:

// $this->db is an instance of \Zend\Db\Adapter\Adapter 
$this->db->query("SET LANGUAGE German;")->execute(); 
$this->db->query("SET DATEFORMAT dmy;")->execute(); 
$sql = "INSERT INTO {$table}("; 

... 
$statement = $this->db->query($sql); 
$result = $statement->execute(); 

Ergebnis:

Statement could not be executed (22007 - 241 - [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string.) 

jedoch, wenn ich schreibe:

$sql = "SET DATEFORMAT DMY; INSERT INTO {$table}("; 

es funktioniert.

Irgendwelche Vorschläge, was falsch ist oder was ich ändern muss? Vielen Dank!

Antwort

0

Mit dieser Methode basierend auf dbAdapter->query()->execute() berauben Sie sich der reichen Klassen Zend\Db\Sql. Durch Zend\Db\Sql\Insert, einfach erweitern Sie diese Klasse wie folgt:

namespace MyProject\Db\Sql; 
use Zend\Db\Sql\Insert as ZendInsert; 
class Insert extends ZendInsert { 
/** 
* @var array Specification array 
*/ 
protected $specifications = [ 
    self::SPECIFICATION_INSERT => 'SET DATEFORMAT DMY; INSERT INTO %1$s (%2$s) VALUES (%3$s)', 
    self::SPECIFICATION_SELECT => 'SET DATEFORMAT DMY; INSERT INTO %1$s %2$s %3$s', 
]; 
}