Zend Db需要为每个插入查询设置dateformat

时间:2016-05-03 22:45:52

标签: php sql-server zend-framework2 zend-db

我试图通过Zend \ Db组件将几行插入到MSSQL服务器数据库中。某些字段包含德语格式的日期,因此DD.MM.YYYY但SQL Server需要YYYY-MM-DD。 SET DATEFORMAT DMY选项通过SQL Management Studio解决了我的问题。但是在PHP中并使用Zend \ Db我必须将此语句放在每个INSERT语句的前面。我不知道为什么?是不是可以为整个会话设置此选项?

示例:

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

它有效。

有什么错误或我需要改变的建议吗?谢谢!

1 个答案:

答案 0 :(得分: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',
];
}