【问题标题】:Can`t insert DATE to mssql via FreeTDS bcp API on linux无法通过 Linux 上的 FreeTDS bcp API 将 DATE 插入 mssql
【发布时间】:2019-11-09 13:51:14
【问题描述】:

当我尝试在 Linux 上通过 FreeTDS bcp 插入 DATE 时,我遇到了这个错误:

Conversion failed when converting date and/or time from character string.
create table test (c_date date);

此列的绑定类型是SYBCHAR,在windows上我没有问题但我使用WinApi

...
char buff[10];
time_t time = ACE_OS::time(nullptr);
struct tm *tmp = localtime(&time);
strftime(buff, 10, "%Y-%m-%d", tmp); /// example: 2008-10-22
bcp_collen(db, 10, 1);
bcp_colptr(db, reinterpret_cast<BYTE*>(buff), 1);
bcp_sendrow(db);
bcp_batch(db); /// here the exception is thrown

我尝试使用另一种日期格式模式,例如%Y%m%d%Y/%m/%d 等,另一种绑定类型,在 freetds.conf 附近创建 locales.conf,但什么都没有……

【问题讨论】:

  • 明确的日期格式是YYYYMMDD,而不是YYYY-MM-DD。对于日期+时间类型,明确的格式是 ISO8601(即YYYY-MM-DD HH:mm......)。删除 ISO8601 中的日期分隔符也可以。
  • @PanagiotisKanavos 我也尝试过这种格式,但不幸的是我遇到了同样的错误

标签: c++ sql-server bcp freetds


【解决方案1】:

要使用 SQL Server date 字段,您必须至少使用 FreeTDS 版本 0.95 并在连接中指定至少 7.3TDS_Version

timedatedatetime2datetimeoffset 类型是在 SQL Server 2008 中引入的,这是第一个支持 TDS 版本 7.3 的版本:

https://www.freetds.org/userguide/choosingtdsprotocol.htm

很可能您使用的是 TDS 版本

【讨论】:

    【解决方案2】:

    我能够插入日期,如果您遇到同样的问题,您应该转换为 UCS2。

    Before data status

    After

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多