首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FireBird2.5 C++客户端:日期数据类型错误

FireBird2.5 C++客户端:日期数据类型错误
EN

Stack Overflow用户
提问于 2015-05-04 12:49:59
回答 1查看 1.2K关注 0票数 4

环境:Firebird 2.5.4-64位,Windows8.1.

我试图使用C客户机API (使用C++ )编写一个VS2013客户机。当在包含日期列的表上准备SELECT语句时收到此错误(调用isc_dsql_prepare函数时出错)

动态SQL错误-SQL错误代码= -804 -Data类型未知-Client SQL方言1不支持对日期数据类型的引用

通过isql工具,我确认数据库使用的是SQL方言3: SQL>显示sql方言;客户端SQL方言设置为:3,数据库SQL方言是:3。

在客户端,我将SQL方言设置为3(至少没有附加错误):

代码语言:javascript
复制
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);
    }

我对时间戳列没有问题,因此我可以将我的所有日期列设置为时间戳类型,但我希望有人能够解释错误消息。

解决方案:非常感谢马克·罗特韦尔,他指出了确切的问题。

首先,关于我如何编写声明的更多信息:

代码语言:javascript
复制
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指南pdf滥用,该指南提供了以下内容:

代码语言:javascript
复制
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提供程序的代码也非常有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 06:39:39

如前所述,API中的一些方法将SQL方言版本作为参数(isc_dsql_prepareisc_dsql_execute_immediateisc_dsql_exec_immed2)。如果使用参数1而不是3调用这些语句,则语句将被解析为方言1语句。

正如您注意到的,Interbase 6 API指南(第122页)中有一个例子说它是SQLDA版本。我的猜测是,在以前版本的Interbase (版本6中引入了方言)中,这个参数 SQLDA版本(例如,在XSQLDA参数之前使用da_version参数的isc_describe ),并且他们重用这个参数来保持方法参数类型和计数相同。有些方法完全需要da_version参数,这有点奇怪( sqlda版本是XSQLDA的一部分)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30030627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档