Как извлечь большие значения из столбцов SQL Server, используя библиотеку DB для C?

#c #sql-server #freetds

#c #sql-server #freetds

Вопрос:

Я использую 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 , я никогда не получаю более 4096 байт в data и len .

Единственное, что мне нужно для выполнения этой работы, — это dbreadtext функция, но я не понимаю, как ее использовать. Единственный бит информации, который я получаю, это:

Используйте dbreadtext вместо dbnextrow для чтения SQLTEXT и SQLIMAGE значений.

Эта функция не принимает номер столбца в качестве аргумента, поэтому я понятия не имею, как ее использовать. Можно ли использовать его только с запросами, которые извлекают только один столбец?

Как я могу получить данные большого столбца?

Комментарии:

1. Спасибо, я больше (на самом деле) спрашивал, было ли это text , но это не так, поэтому убил эту мысль. 🙂

2. @Larnu Я также пробовал с varchar(max) , text и image , и поведение одинаково для всех. Есть ли проблема с text ?

Ответ №1:

У FreeTDS есть опция, text size , которую можно установить в freetds.conf :

См. Таблицу 3.3, text size : https://www.freetds.org/userguide/freetdsconf.html

Попробуйте?

Комментарии:

1. Ах, это выглядит правильно. Это также указывает мне SET TEXTSIZE , что может быть более простым решением для меня. Я попробую, а затем приму ваш ответ.