2016-05-03 6 views
0

Я пытаюсь вставить пару строк в базу данных сервера MSSQL через компонент Zend \ Db. Некоторые поля содержат даты в немецком формате, поэтому DD.MM.YYYY, но SQL Server ожидает YYYY-MM-DD. Существует опция SET DATEFORMAT DMY, которая решает мою проблему через SQL Management Studio. Однако в PHP и использовании Zend \ Db я должен поставить это утверждение перед каждым оператором INSERT. Я не знаю почему? Разве нет возможности установить это для целого сеанса?Zend Db требует набора даты для каждого запроса на вставку

Пример:

// $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(); 

Результат:

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.) 

Однако, когда я пишу:

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

это работает.

Любые предложения, что не так или что мне нужно изменить? Благодаря!

ответ

0

Используя этот метод на основе dbAdapter->query()->execute(), вы лишаетесь богатых классов Zend\Db\Sql. Через Zend\Db\Sql\Insert просто пропустите этот класс следующим образом:

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', 
]; 
}