如何使用 C 的 DB 库从 SQL Server 列中检索大值?

Posted

技术标签:

【中文标题】如何使用 C 的 DB 库从 SQL Server 列中检索大值?【英文标题】:How to retrieve large values from SQL Server columns using DB Library for C? 【发布时间】:2021-03-03 19:15:21 【问题描述】:

我正在使用 FreeTDS 处理简单的SELECT 语句。

我的问题是我无法获得超过大列值的前 4096 个字节。

假设我们有一张这样的表:

CREATE TABLE tab (
   largecol varbinary(max),
   othercol int PRIMARY KEY
);

我的代码如下所示(简化并省略了错误检查):

#include <sybfront.h>
#include <sybdb.h>

int main ()

    DBPROCESS *dbproc;
    LOGINREC *login;
    char *data;
    DBINT len;

    /* setup */
    dbinit();
    login = dblogin();

    DBSETLUSER(login, "username");
    DBSETLPWD(login, "password");
    DBSETLAPP(login, "my_program");
    DBSETLPACKET(login, 10000);
    DBSETLNATLANG(login, "us_english");
    DBSETLCHARSET(login, "UTF-8");

    /* connect */
    dbproc = dbopen(login, "hostname");
    dbuse(dbproc, "dbname");

    /* execute query */
    dbcmd(dbproc, "SELECT largecol, othercol FROM tab");
    dbsqlexec(dbproc);
    dbresults(dbproc);

    /* retrieve result */
    dbnextrow(dbproc);
    data = (char *)dbdata(dbproc, 1);
    len = dbdatlen(dbproc, 1);

    /* more processing */

现在无论largecol 中的数据有多大,我在datalen 中得到的字节数永远不会超过4096。

我必须完成这项工作的唯一线索是dbreadtext 函数,但我不明白如何使用它。我得到的唯一信息是:

使用dbreadtext 而不是dbnextrow 来读取SQLTEXTSQLIMAGE 值。

该函数不接受列号作为参数,所以我不知道如何使用它。它只能用于只检索单个列的查询吗?

如何检索大列数据?

【问题讨论】:

谢谢,我更(真的)问它是否是text,但它不是,所以杀死了那个思想火车。 :) @Larnu 我也尝试过使用varchar(max)textimage,所有的行为都是一样的。 text 有问题吗? 【参考方案1】:

FreeTDS有一个选项,text size,可以在freetds.conf中设置:

见表 3.3,text size: https://www.freetds.org/userguide/freetdsconf.html

试试看?

【讨论】:

啊,这看起来不错。它还指向SET TEXTSIZE,这对我来说可能是更简单的解决方案。我会试试看,然后接受你的回答。

以上是关于如何使用 C 的 DB 库从 SQL Server 列中检索大值?的主要内容,如果未能解决你的问题,请参考以下文章

在sqlserver中如何导入.db数据库文件

如何让Activiti-Explorer使用sql server数据库

如何实现Paradox数据库文件(*.db)到sql server数据库的导入----要求用代码,不用向导

如何从 SQL Server DB 创建 SQL Server Express DB

SQL Server - Sakila DB

如何使用 OpenQuery 在 SQL Server 中创建别名 (IBM DB2)