Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQLPrepare, SQLBindParameter и binary data, ODBC winapi 
V
    Опции темы
Static
Дата 21.1.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Задача - писать файлы "как есть" в базу данных. Используется ODBC winapi. Т.е. - читаем файлик в буфер (fopen, fread) и пишем этот буфер в базу в поле типа long binary (длина данных в поле ограничена размером файла БД).
Так выглядит prepared satement:
Код

INSERT INTO update_data (name_executable, file_path, file_checksum, file_body) VALUES ('test', ?, ?, ?)


А вот так я "приклеиваю" параметры:
Код

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, path_len, 0, path, 0, &datalen);
SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &crc, 0, &datalen);
SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, file_len, 0, filebody_buf, 0, &datalen);

Результат - не работает smile Точнее - работет не все. Integer в базу пишется. Похоже, что я неправильно передаю параметры. Отсюда вопрос - как правильно? Я что-то запутался в параметрах SQLBindParameter - что есть ColumnSize и BufferLength?

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Static
Дата 21.1.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Так, немного разобрался.
ColumnSize - длина буфера данных, имеет значение только для char и binary. Последний параметр - не должен менятся в промежутке от SQLBindParameter до SQLExecute (ну это я уже накосячил от безысходности).
BufferLength - пока непонятно. Для int и char - должен быть 0:
Код

datalen_char = SQL_NTS;
datalen_int = 0;
datalen_binary = ???;
SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(path), 0, path, 0, &datalen_char);
SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &crc, 0, &datalen_int);
SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, file_len, 0, filebody_buf, 0, &datalen_binary);//??

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Static
Дата 22.1.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Вот пример того, как надо передавать бинарные данные в базу.

Код

rc = SQLBindParameter(hstmt , 3, SQL_PARAM_INPUT, SQL_C_BINARY,SQL_LONGVARBINARY,0,0, (SQLPOINTER)3,0,&type);//номер параметра вместо буфера

type = SQL_LEN_DATA_AT_EXEC(0);
rc = SQLExecute(hstmt); //ок

while (SQL_NEED_DATA == rc)
    {
    rc = SQLParamData(hstmt, &pToken); //ок
    if (rc == SQL_NEED_DATA) 
        {
        unsigned char* data = buf;
        SQLINTEGER data_size = buf_len;
        rc = SQLPutData(hstmt, data, data_size); //ок
        }
    }

rc = SQLParamData(hstmt, &pToken); //по идее, это должно сказать драйверу, что мы завершили передачу данных для этого параметра.


У меня все отрабатывает нормально до последнего SQLParamData. Вызов функции не завершается и программа виснет :(
Что не так? Ну хоть что-нибудь ответьте...

Это сообщение отредактировал(а) Static - 22.1.2010, 10:39
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Static
Дата 4.2.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: нет
Всего: 2



Мда, забыл отписаться - все получилось. Проблема была не там, где я ее искал. Нужно было настроить блокировку транзакций СУБД - получалось, что я следил из другой программы за содержимым базы, тем самым мешая ей выполнять мои запросы.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.