我有一个简单的c ++代码,可以通过ODBC在SQL Server 2014中插入记录。它适用于varchar字段,但它不适用于datetime字段。
SQLCHAR buf[64];
SQLLEN len;
SQLCHAR buf2[255];
SQLLEN len2;
SQLLEN len3;
double f;
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_TYPE_TIMESTAMP, 19, 0, (SQLCHAR*)buf, 0, &len);
rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 255, 0, (SQLCHAR*)buf2, 0, &len2);
rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 15, 0, &f, 0, &len3);
rc = SQLPrepare(hstmt, (SQLCHAR*)"insert into test(timepoint,strvalue,floatvalue) values (?,?,?)", SQL_NTS);
strcpy((char*)buf,"20171010 00:08:14");
len=strlen("20171017 00:08:14");
strcpy((char*)buf2,"simple string");
len2=strlen("simple string");
f=1.34e+8;
SQLSMALLINT NumParams;
SQLNumParams(hstmt, &NumParams);
rc = SQLExecute(hstmt);
任何人都可以帮助理解这是错的吗? 我一直都有:
" 22018:1:0:[Microsoft] [ODBC SQL Server驱动程序]转换规范的字符值无效\ n"
如果我的问题在这里错了,请提示哪个论坛更合适。我已经度过了几天,但无法找到解决方案。对于任何帮助将非常感激。
答案 0 :(得分:0)
SQL Server可以隐式地将不同日期格式的各种字符串转换为实际日期,但您必须非常小心如何使用它们:
未分离的日期格式" yyyyMMdd",无法携带时间!
SELECT CAST('20170102' AS DATETIME) --2017-01-02 00:00:00.000
最通用的格式为ISO8601
,yyyy-MM-ddTHH:mm:ss
(谨防中间的T
和24小时格式的使用!)
SELECT CAST('2017-01-02T12:23:59' AS DATETIME) --2017-01-02 12:23:59.000
而且 - 最后但并非最不重要 - 有三种ODBC
格式:
SELECT CAST({d'2017-01-02'} AS DATETIME) --2017-01-02 00:00:00.000
SELECT CAST({t'23:35:51'} AS DATETIME) --2018-01-19 23:35:51.000 (today!)
SELECT CAST({ts'2017-01-02 23:35:51'} AS DATETIME) --2017-01-02 23:35:51.000
最重要的! - 提示:某些格式有效,但取决于系统的设置。这可以为您工作并通过所有内部测试,但可能会破坏客户的机器:
SET LANGUAGE ENGLISH;
SELECT CAST('2017-01-02 23:35:51' AS DATETIME) -- Jan 2
SET LANGUAGE GERMAN;
SELECT CAST('2017-01-02 23:35:51' AS DATETIME) -- Feb 1