環境:Firebird 2.5.4-64bit,在Windows 8.1上。Firebird 2.5 C++客戶端:DATE數據類型錯誤
我正在嘗試使用C客戶端API(使用VS2013)編寫C++客戶端。在表上製備SELECT語句包含日期欄(呼叫isc_dsql_prepare功能時錯誤)
動態SQL錯誤 -SQL錯誤代碼= -804 -Data類型未知 - 客戶端SQL方言當我收到此錯誤1不支持參考DATE數據類型
從isql工具中,我確認數據庫是用SQL方言3: SQL> show sql dialect; 客戶端SQL方言設置爲:3和數據庫SQL方言:3
在客戶端,我設置的SQL方言爲3(至少我沒有上安裝誤差):
uint32_t sqlDialect = 3;
const char* charset = "UTF8";
char dpbBuffer[256], *dpb, *p;
dpb = dpbBuffer;
*dpb++ = isc_dpb_version1;
*dpb++ = isc_dpb_user_name;
*dpb++ = user.size();
strcpy(dpb, user.c_str());
dpb += user.size();
*dpb++ = isc_dpb_password;
*dpb++ = pwd.size();
strcpy(dpb, pwd.c_str());
dpb += pwd.size();
*dpb++ = isc_dpb_lc_ctype;
*dpb++ = 4;
strcpy(dpb, charset);
dpb += 4;
*dpb++ = isc_dpb_sql_dialect;
memcpy(dpb, &sqlDialect, 4);
dpb += 4;
short dpbLength = dpb - dpbBuffer;
if (isc_attach_database(status, 0, url.c_str(), &_db, dpbLength, dpbBuffer))
{
isc_print_status(status);
}
我對TIMESTAMP列沒有任何問題,因此我可以將我所有的DATE列設置爲TIMESTAMP類型,但我希望有人能夠解釋錯誤消息。
SOLUTION: 非常感謝Mark Rotteveel指出了確切的問題。
std::string sql = "SELECT * FROM truc";
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(NbColumn));
out_sqlda->version = SQLDA_VERSION1;
out_sqlda->sqln = NbColumn;
isc_stmt_handle stmt;
isc_dsql_allocate_statement(status, &_db, &stmt);
isc_dsql_prepare(status, &(TransactHandle), &stmt, 0, sql.c_str(), 1, out_sqlda);
我被Interbase的API指南PDF濫用其給出以下:
isc_dsql_prepare(
status_vector,
&trans, /* Set by previous isc_start_transaction() call. */
&stmt, /* Statement handle set by this function call. */
0, /* Specifies statement string is null-terminated. */
str, /* Statement string. */
SQLDA_VERSION1, /* XSQLDA version number. */
out_sqlda /* XSQLDA for storing column data. */
);
但第6個參數不是
首先,我如何準備語句的詳細信息SQLDA版本,但SQL方言!!!把3解決這個問題。 查看.Net提供程序的代碼也非常有幫助。
顯示您用來準備和執行查詢的代碼;有一些方法也採用方言參數。 –