Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Помогите решить или укажите, пожалуйста, соответствующую ветку по след. проблеме:
Требуется записать массив бинарных данных, включая нули, в таблицу со след структурой из программы на С.
Происходит обрезание данных на нулевом байте 0x00.
Структура sql-таблицы major:
(smallint) Frame_number | (longblob) ch1 | (longblob) ch2 | (longblob) ch3 | (longblob) ch4 | (smallint) frame_size
Соединение с базой установлено, вся необходимая память указателям выделена...
1. Подготовка запроса:
SQLPrepare(sql_hStmt,_T("INSERT INTO major(Frame_number,CH1,CH2,CH3,CH4,frame_size) VALUES(?,?,?,?,?,?)"),SQL_NTS);
2. Привязка параметров:
SQLBindParameter(sql_hStmt, 1, SQL_PARAM_INPUT, SQL_INTEGER, SQL_INTEGER, 0,0, &frames_parsed, 0, 0);
SQLBindParameter(sql_hStmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 5, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 6, SQL_PARAM_INPUT, SQL_INTEGER, SQL_INTEGER, 0,0, &datasize, 0, 0);
где v - массив данных, bufsz - его размер
3. Цикличное выполнение запроса
SQLExecute(sql_hStmt);
Версия MySQL - 5.5
Версия OBDC - Mysql ODBC 5.1
Отредактированно whitesail (07.08.2010 12:17:00)
Неактивен
А ODBC 3.23 не пробовали?
Неактивен
http://dev.mysql.com/doc/refman/5.1/en/ … -news.html
Самый ранний ODBC 3.51.11 (28 January 2005)
Неактивен
Эм. Ну, значит, 3.51. В пятерке есть некоторое количество известных ошибок, но
так как новой функциональности в самом коннекторе нету (кроме возможности
использовать пароли из версий MySQL 4.1+), то можно пробовать использовать
третий.
Неактивен
Ввиду информации на странице:
http://dev.mysql.com/doc/refman/5.1/en/ … query.html
написал:
mysql_query() cannot be used for statements that contain binary data; you must use mysql_real_query() instead. (Binary data may contain the “\0” character, which mysql_query() interprets as the end of the statement string.) In addition, mysql_real_query() is faster than mysql_query() because it does not call strlen() on the statement string.
Таким образом, полагаю, что подход обозначенный выше ошибочный в принципе. Вероятно, SQLVARCHAR наткнувшись на NULL byte желает мне всего хорошего...
Отредактированно whitesail (07.08.2010 15:29:27)
Неактивен
Это то да, но ODBC должен правильно эскейпить данные при запросах.
Т.е. если бы Вы делали strcat, то тогда я бы Вам это сразу и сказал. А тут
всё-таки ощущение, что драйвер не эскейпит. Ну, при условии, что Вы
ищете bufsz не через strlen
Неактивен
Все проще оказалось: вместо нулевого байта надо передавать SQL_NULL_DATA.
Неактивен
Честно говоря, не понял последней фразы. Как Вы передадите SQL_NULL_DATA
в строке "blah\0minor"?
Неактивен
данные бинарные: "0xbb0xccSQL_NULL_DATA"
Неактивен
Стало еще меньше понятно. Вы прямо строкой передаете SQL_NULL_DATA внутри
строки? Как оно тогда вообще работает?
celestia:~$ cat a.c #include <stdio.h> int main() { char z[] = "0xbb0xccSQL_NULL_DATA"; printf("%d\n", sizeof(z)); } celestia:~$ gcc a.c celestia:~$ ./a.out 22
Неактивен
Прошу прощения за поспешность в ответе, выложу весь код чуть позже.
Неактивен
Страниц: 1