环境: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提供程序的代码也非常有帮助。
显示您用来准备和执行查询的代码;有一些方法也采用方言参数。 –