1. 程式人生 > >ODBC:Datetime 欄位溢位。秒的小數精度超出了在引數繫結中指定的小數位數。

ODBC:Datetime 欄位溢位。秒的小數精度超出了在引數繫結中指定的小數位數。

在使用ODBC將SQL_TIMESTAMP_STRUCT格式的資料儲存到MS SQL Server的datetime欄位時,報如下錯誤:

Datetime 欄位溢位。秒的小數精度超出了在引數繫結中指定的小數位數。

 C++程式碼如下:

void execSql(SQLHSTMT hstmt, SQLUINTEGER id, SQL_TIMESTAMP_STRUCT optDtm) {
  SQLRETURN retCode;
  SQLLEN cbId = 0, cbOptDtm = 0;
  
  retCode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, sizeof(SQLUINTEGER), 0, &id, 0, &cbId);
  retCode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, sizeof(optDtm), 0, &optDtm, 0, &cbOptDtm);
  
  SQLWCHAR* sql = (SQLWCHAR*)L"INSERT INTO tb_test(id, opt_dtm) VALUES (?, ?);";
  retCode = SQLPrepare(hstmt, sql, SQL_NTS);
  
  retCode = SQLExecute(hstmt);
}

ODBC驅動:ODBC Driver 17 for SQL Server
opt_dtm:在資料庫中的型別為datetime

通過網上查詢,說SQLBindParameter中的DecimalDigits是用來設定秒後小數的位數的。datetime是3位,datetime2是7位。

SQLBindParameter的定義如下:

SQLRETURN SQLBindParameter(  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ParameterNumber,  
      SQLSMALLINT     InputOutputType,  
      SQLSMALLINT     ValueType,  
      SQLSMALLINT     ParameterType,  
      SQLULEN         ColumnSize,  
      SQLSMALLINT     DecimalDigits,  
      SQLPOINTER      ParameterValuePtr,  
      SQLLEN          BufferLength,  
      SQLLEN *        StrLen_or_IndPtr);

 但把程式碼中DecimalDigits引數的值改成3,還是報一樣的錯:

retCode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, sizeof(optDtm), 3, &optDtm, 0, &cbOptDtm);

如果不使用SQL_TIMESTAMP_STRUCT,而使用日期字串,就可以成功插入,程式碼如下:

SQLCHAR* optDtm = (SQLCHAR*)"2008-09-09 10:10:10,200";
retCode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 23, 0, optDtm, 0, &cbOptDtm);

至於為什麼使用SQL_TIMESTAMP_STRUCT插入不成功,只能看看以後能不能批到解決辦法了。

參考文件