powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC API: INSERT с параметрами портит базу Access
6 сообщений из 6, страница 1 из 1
ODBC API: INSERT с параметрами портит базу Access
    #32202543
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Помогите разобраться с ODBC API, видимо, я что-то не так понимаю!

Мне нужно добавлять строки в таблицу и я решил сумничать и сделать это с предварительным приготовлением запроса. Запрос готовлю простой: INSERT INTO ... VALUES (?,?,?); потом привязываю параметры к переменным при помощи SQLBindParameter, причем Си-тип указываю как SQL_C_CHAR, а тип в базе SQL_CHAR, размер в базе 40, в си - 41. База в формате Access 2003. В общем, я кладу значения в переменные, потом делаю SQLExecute и база портится - в нее заносится фигня, все последующие обращения к любым SQLExecute дают ошибку "неверное состояние курсора" и базу надо восстанавливать.

Явно записанный и прямо выполненый через SQLExecDirect запрос прекрасно работает.

Когда я смотрю трассировку ODBC, то вижу текст запроса на этапе приготовления и там все нормально. На этапе выполнения - тоже все нормально, т.е. возврат SQL_SUCCESS, но база уже, судя по всему, портится.

Не знает ли кто-нибудь, какие тут могут быть подводные камни? Как можно отладить это дело?

У меня наибольшее подозрение вызывает параметр SQLINTEGER * StrLen_or_IndPtr. Я пробовал два варианта - давал его в NULL или давал в него указатель на переменную, в которую клал SQL_NTS. Может это как-то взаимодействует с типом SQL_CHAR, а надо, например, SQL_VARCHAR или еще что?
...
Рейтинг: 0 / 0
ODBC API: INSERT с параметрами портит базу Access
    #32202590
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, база все-таки не портится, а параметры просто сдвигаются и вводятся не туда!

Запрос у меня такой

INSERT INTO [Word] ([Spell], [Length], [Freq]) Values (?,?,?)

А данные вводятся из параметра номер 2 - в Length, из параметра номер 3 - в Freq, а из параметра Spell - теряются.

Параметры привязываю так:

SQLBindParameter( hstmtAddWord, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 40, 0, SpellQuery, 0, &SpellQueryLenOrInd );

SQLBindParameter( hstmtAddWord, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &WordLength, sizeof(WordLength), &WordLengthLenOrInd );

SQLBindParameter( hstmtAddWord, 3, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &WordFreq, sizeof(WordFreq), &WordFreqLenOrInd );


Если бы я просто забыл привязать первый параметр, она бы ведь ругнулась, что не все параметры привязаны!
...
Рейтинг: 0 / 0
ODBC API: INSERT с параметрами портит базу Access
    #32202597
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я завел структуру, повторяющую структуру таблицы:

struct CWordRec {
SQLINTEGER ID;
SQLCHAR Spell[41];
SQLSMALLINT Length;
SQLINTEGER Freq;
};

Тщательно привязываю параметры:

SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmtWordInsert);
SQLPrepare( hstmtWordInsert, (SQLCHAR*)"INSERT INTO [Word] ([Spell], [Length], [Freq]) Values (?,?,?)", SQL_NTS );
SQLBindParameter( hstmtWordInsert, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 40, 0, recWordInsert.Spell, 41, NULL );
SQLBindParameter( hstmtWordInsert, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_SMALLINT, 0, 0, &recWordInsert.Length, sizeof(SQLSMALLINT), NULL );
DB_IsOk(SQLBindParameter( hstmtWordInsert, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &recWordInsert.Freq, sizeof(SQLINTEGER), NULL );

И теперь при выполнении кода:

strcpy( (char*)recWordInsert.Spell, strSpell ); // = "!"
recWordInsert.Freq = Freq; // = 14
recWordInsert.Length = strSpell.GetLength(); = 1
SQLExecute( hstmtWordInsert );

В таблицу добавляется строка, как будто VALUES('0', 0, 14), вместо VALUES('!',1,14)

Почему??? :-((
...
Рейтинг: 0 / 0
ODBC API: INSERT с параметрами портит базу Access
    #32203023
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я закомментирую привязку ТРЕТЬЕГО параметра, то возникает ошибка "Неверное поле COUNT" (Это я так понимаю дебильский перевод фразы "Неверное число полей"), а вот если я закомментирую привязку любого из первых двух полей, то никакой ошибки не возникает, словно система думает, что эти параметры и НЕ НАДО привязывать!!!
...
Рейтинг: 0 / 0
ODBC API: INSERT с параметрами портит базу Access
    #32203060
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я попробовал менять порядок параметров в запросе

INSERT INTO Word (Freq,Leng,Spell) VALUES (?,?,?)
INSERT INTO Word (Spell,Freq,Leng) VALUES (?,?,?)
INSERT INTO Word (Spell,Leng,Freq) VALUES (?,?,?)

При этом в функциях SQLBindParameter менял номера соответственно. Менял только номера, общий синтаксис не трогал.

Выяснилось, что передается всегда последний параметр, каким бы он не был. И передается он правильно, то есть, попадает в свою колонку и верно отражает данные...

???
...
Рейтинг: 0 / 0
ODBC API: INSERT с параметрами портит базу Access
    #32203076
Dmitry S. Kravchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В другом месте кода, на тот же хэндлер привязывались параметры 1 и 2
Все как всегда :-))
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC API: INSERT с параметрами портит базу Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]