如何使用 SQLBindParameter 绑定 datetime2(SQL_C_TYPE_TIMESTAMP)?
How can one bind datetime2(SQL_C_TYPE_TIMESTAMP) using SQLBindParameter?
我正在尝试使用 SQLBindParameter 为 SQL_TYPE_TIMESTAMP
数据类型绑定 datetime2 参数,如下所示
SQLBindParameter(hStmt, 7, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &datetime2, 0, NULL);
也试过这个:
rc = SQLBindParameter(hStmt, 8, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, SQL_TIMESTAMP_LEN + 1, 7, &rec.datetime2, 0, NULL);
rc 为 0
当我执行查询时(插入)
SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS);
我收到 22008 sqlstate 错误,指示日期时间字段溢出;
我已经查找了有关此数据类型的任何示例代码,但找不到任何可用的示例,是否有忍者对此类型有解决方案?
精度为 7 的 SQL_TYPE_TIME 没问题。
我在 SQL Server 2014 中遇到同样的错误:如果我使用 nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue);
进行绑定,我得到:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for
SQLerver]Datetime field overflow. Fractional second precision exceeds
the scale specified in the parameter binding.
因此,我尝试使用如下代码检查服务器实际期望的内容:
nResult = SQLPrepare(hstmt, (SQLWCHAR*)L"INSERT INTO tTestTable (myTestCol, d2) VALUES(100, ?)", SQL_NTS);
SQLSMALLINT DataType, DecimalDigits, Nullable;
SQLUINTEGER ParamSize;
nResult = SQLDescribeParam(hstmt, 1, &DataType, &ParamSize, &DecimalDigits, &Nullable);
if (!SQL_SUCCEEDED(nResult))
{
printErrStmt(hstmt);
}
std::wcout << L"ParamSize: " << ParamSize << L"; DecimalDigits: " << DecimalDigits << std::endl;
打印出来:
ParamSize: 27; DecimalDigits: 7
所以,让我们尝试使用 27 和 7 以及 123
的一小部分 - 我仍然得到错误:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for
SQL erver]Datetime field overflow. Fractional second precision exceeds
the scale specified in the parameter binding.
但后来我在微软找到了示例:https://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx
这个示例让事情变得更加混乱,因为它们做的是完全一样的事情?等等 - 不同之处在于,他们只使用 100
的小数值 - 这会有所作为吗?是的,它确实。将分数更改为 100
可以使事情正常进行。为什么?
让我们直接看SQL Server 2014。如果我插入一个行(来自 ODBC),带有 100
的一小部分,这将显示(在 SQL Server Management Studio 中)为:1999-02-03 08:20:30.0000001
。记住分数到底是什么:来自 MS 的文档:https://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx
[b] The value of the fraction field is the number of billionths of a
second and ranges from 0 through 999,999,999 (1 less than 1 billion).
For example, the value of the fraction field for a half-second is
500,000,000, for a thousandth of a second (one millisecond) is
1,000,000, for a millionth of a second (one microsecond) is 1,000, and
for a billionth of a second (one nanosecond) is 1.
所以:100
的一小部分就是十亿分之一秒,这是 000,000,100
。但是 Datetime2 字段的精度为 7
。由于最后一部分是 00
,因此没有舍入误差。但是如果你传入 123
,这将是 000,000,123
。这不能存储在精度为 7.
的日期时间中。如果我们将 123
更改为 12300
,则可以存储内容:它最多匹配 000,012,300
,这符合精度为 7 的日期时间,以及 SQL 服务器最后显示:1999-02-03 08:20:30.0000123
.
我希望这对您有所帮助,我希望我正确理解并解释了小数部分。
我正在尝试使用 SQLBindParameter 为 SQL_TYPE_TIMESTAMP
数据类型绑定 datetime2 参数,如下所示
SQLBindParameter(hStmt, 7, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &datetime2, 0, NULL);
也试过这个:
rc = SQLBindParameter(hStmt, 8, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, SQL_TIMESTAMP_LEN + 1, 7, &rec.datetime2, 0, NULL);
rc 为 0
当我执行查询时(插入)
SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS);
我收到 22008 sqlstate 错误,指示日期时间字段溢出;
我已经查找了有关此数据类型的任何示例代码,但找不到任何可用的示例,是否有忍者对此类型有解决方案? 精度为 7 的 SQL_TYPE_TIME 没问题。
我在 SQL Server 2014 中遇到同样的错误:如果我使用 nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue);
进行绑定,我得到:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQLerver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.
因此,我尝试使用如下代码检查服务器实际期望的内容:
nResult = SQLPrepare(hstmt, (SQLWCHAR*)L"INSERT INTO tTestTable (myTestCol, d2) VALUES(100, ?)", SQL_NTS);
SQLSMALLINT DataType, DecimalDigits, Nullable;
SQLUINTEGER ParamSize;
nResult = SQLDescribeParam(hstmt, 1, &DataType, &ParamSize, &DecimalDigits, &Nullable);
if (!SQL_SUCCEEDED(nResult))
{
printErrStmt(hstmt);
}
std::wcout << L"ParamSize: " << ParamSize << L"; DecimalDigits: " << DecimalDigits << std::endl;
打印出来:
ParamSize: 27; DecimalDigits: 7
所以,让我们尝试使用 27 和 7 以及 123
的一小部分 - 我仍然得到错误:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQL erver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.
但后来我在微软找到了示例:https://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx
这个示例让事情变得更加混乱,因为它们做的是完全一样的事情?等等 - 不同之处在于,他们只使用 100
的小数值 - 这会有所作为吗?是的,它确实。将分数更改为 100
可以使事情正常进行。为什么?
让我们直接看SQL Server 2014。如果我插入一个行(来自 ODBC),带有 100
的一小部分,这将显示(在 SQL Server Management Studio 中)为:1999-02-03 08:20:30.0000001
。记住分数到底是什么:来自 MS 的文档:https://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx
[b] The value of the fraction field is the number of billionths of a second and ranges from 0 through 999,999,999 (1 less than 1 billion). For example, the value of the fraction field for a half-second is 500,000,000, for a thousandth of a second (one millisecond) is 1,000,000, for a millionth of a second (one microsecond) is 1,000, and for a billionth of a second (one nanosecond) is 1.
所以:100
的一小部分就是十亿分之一秒,这是 000,000,100
。但是 Datetime2 字段的精度为 7
。由于最后一部分是 00
,因此没有舍入误差。但是如果你传入 123
,这将是 000,000,123
。这不能存储在精度为 7.
的日期时间中。如果我们将 123
更改为 12300
,则可以存储内容:它最多匹配 000,012,300
,这符合精度为 7 的日期时间,以及 SQL 服务器最后显示:1999-02-03 08:20:30.0000123
.
我希望这对您有所帮助,我希望我正确理解并解释了小数部分。