2015-05-04 30 views
4

環境: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提供程序的代碼也非常有幫助。

+1

顯示您用來準備和執行查詢的代碼;有一些方法也採用方言參數。 –

回答

2

如前所述,API中的某些方法以SQL語言版本作爲參數(isc_dsql_prepare,isc_dsql_execute_immediateisc_dsql_exec_immed2)。如果您使用參數1而不是3調用這些參數,您的語句將被解析爲方言1語句。

正如您注意到Interbase 6 API指南(第122頁)中的示例所說,它是SQLDA版本。我的猜測是,在以前版本的Interbase中(方言在版本6中引入),此參數的SQLDA版本(例如參見isc_describe,參數XSQLDA之前需要參數da_version),並且他們重​​新使用此參數來保留方法參數類型和計數相同。事實上,其中一些方法需要參數da_version有點奇怪(sqlda版本是XSQLDA的一部分)。