Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ODBC API: INSERT с параметрами портит базу Access
|
|||
|---|---|---|---|
|
#18+
Привет! Помогите разобраться с 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 или еще что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2003, 21:47 |
|
||
|
ODBC API: INSERT с параметрами портит базу Access
|
|||
|---|---|---|---|
|
#18+
Похоже, база все-таки не портится, а параметры просто сдвигаются и вводятся не туда! Запрос у меня такой 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 ); Если бы я просто забыл привязать первый параметр, она бы ведь ругнулась, что не все параметры привязаны! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 01:54 |
|
||
|
ODBC API: INSERT с параметрами портит базу Access
|
|||
|---|---|---|---|
|
#18+
Я завел структуру, повторяющую структуру таблицы: 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) Почему??? :-(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 02:43 |
|
||
|
ODBC API: INSERT с параметрами портит базу Access
|
|||
|---|---|---|---|
|
#18+
Если я закомментирую привязку ТРЕТЬЕГО параметра, то возникает ошибка "Неверное поле COUNT" (Это я так понимаю дебильский перевод фразы "Неверное число полей"), а вот если я закомментирую привязку любого из первых двух полей, то никакой ошибки не возникает, словно система думает, что эти параметры и НЕ НАДО привязывать!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:19 |
|
||
|
ODBC API: INSERT с параметрами портит базу Access
|
|||
|---|---|---|---|
|
#18+
Я попробовал менять порядок параметров в запросе INSERT INTO Word (Freq,Leng,Spell) VALUES (?,?,?) INSERT INTO Word (Spell,Freq,Leng) VALUES (?,?,?) INSERT INTO Word (Spell,Leng,Freq) VALUES (?,?,?) При этом в функциях SQLBindParameter менял номера соответственно. Менял только номера, общий синтаксис не трогал. Выяснилось, что передается всегда последний параметр, каким бы он не был. И передается он правильно, то есть, попадает в свою колонку и верно отражает данные... ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2003, 12:44 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32203076&tid=2036204]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 264ms |
| total: | 433ms |

| 0 / 0 |
