为Sql server实现odbc包装器。将数据库数据作为字符读取或要求驱动程序将数据转换为C类型

问题描述 投票:4回答:1

我用odbc编写了一个数据库包装器来与sql server数据库进行通信。它正在工作,但我正在做的是我正在读取所有数据类型作为字符(使用SQLBindCol绑定列时指定的字符数)并将返回的字符更改为我的应用程序中所需的数据类型。

我知道这个方法不是很有效,因为我每次都将返回的字符转换为我的应用程序中所需的数据类型,我可以想象这将花费额外的时间进行转换。

我看到SQLBindCol的微软参考说明

当它使用SQLFetch,SQLFetchScroll,SQLBulkOperations或SQLSetPos从数据源检索数据时,驱动程序将数据转换为此类型

这是我需要的,我认为与我的代码(将所有内容都作为字符读取)相比,这将是有效的。

sqlbindcol sqlfetch

下面是ODBC API函数调用的顺序

  • SQLAllocHandle(分配环境句柄)
  • SQLSetEnvAttr
  • SQLAllocHandle(分配数据库句柄)
  • 的SQLDriverConnect
  • SQLAllocHandle(分配语句句柄)
  • SQLExecDirect的
  • SQLBindCol
  • 的SQLFetch。

每当我绑定列时,我都指定,TargetType为sql_char,以及调用sqlfetch时要推送到应用程序缓冲区(* void)的字符数。

当我想读取大字符串(例如xml数据)和未知大小的数据时,此方法不可行。

我想知道我是否将所有数据类型读作字符,就像我怎么做的一样?如何读取返回结果列中的所有数据而不指定要推入缓冲区的数字字符?

我从文档中读到,我们可以要求驱动程序在SQLBindCol中转换为指定的C类型。怎么做到这一点?我存储列信息的结构是

struct ColValInfo
{
    ColValInfo(): pValue(0){}

    SQLPOINTER pValue; // typedef void * SQLPOINTER;
    SQLINTEGER StrLen_or_Ind; // typedef long  SQLINTEGER;
};

p Value是一个void指针。如果驱动程序想要进行转换并将数据返回到p Value。做了所有必要的事情。

c++ sql-server database odbc
1个回答
0
投票

我想你在SQLDescribeCol跟注之前错过了对SQLBindCol的调用。

它将为您提供列类型和列大小。然后,您将使用与列的SQL类型对应的C类型相应地分配缓冲区,并且不会转换任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.