Андрей |
Отправлено: 21.09.2004, 18:16 |
|
Не зарегистрирован
|
Помогите !
У меня проблема при обновлении таблицы.
Есть таблица в которой есть поля VARCHAR и одно поле типа Memo (поле KEY).
1. Был запрос с параметрами типа:
UPDATE Clients SET [SYSTEM NAME]=:SYSNAME, NAME=:NAME, KEY=:KEY
Длинна значения KEY> 255 и при обновлении выдается ошибка, что поле должно быть усечено. Если значение < 255, то все ОК.
Переделал на:
UPDATE Clients SET [SYSTEM NAME]='Значение системного имени', NAME='Значение имени', KEY='Значение ключа'
Значение поля KEY — CD:15:61:6F:1B:1D:96:E0:C6:44:D6:23:D5:69:4B:42
После переделки такая проблема:
1. Если полю NAME присваивать значение где присутствует три пары кавычек (Например ЗАО "Пирамида""), то выдается ошибка Missing right qoute
2. Если значение поля KEY пустое, три пары кавычек записать в базу можно.
Я так понимаю, что CBuilder воспринимает значение поля Key как параметры и при трех парах кавычек его почемуто свихивает.
У меня C++Builder 6 EE + SP4
PS: До SP4 все было так же...
Помогите ... Жду советов
|
|
Андрей |
Отправлено: 21.09.2004, 18:18 |
|
Не зарегистрирован
|
Да забыл сказать, что БД Access и работаю через ODBC. |
|
AVC |
Отправлено: 22.09.2004, 08:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
При записи данных с кавычками, первый вариант самый правильный иначе вам придется вручную анализировать значения полей или получать ошибки (что у вас и происходит).
Стоит доработать вариант №1. Разобраться, кто требует усечения или поробовать заменить заменить Memo на varchar (Memo действительно необходим?)
Сейчас малость разгребусь и попробую поэксперементировать (если это еще будет нужно).
Кстати, вы в Update не забыли ли указать Where или действительно меняете описания сразу у всех клиентов. |
|
olegenty |
Отправлено: 22.09.2004, 08:45 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
первый вариант был верным, второй — значительно хуже. возвращайся обратно к первому и разбирайся с типами полей и параметров. грабли (если поле позволяет хранить строку длиннее 255 символов — проверь объявление таблицы) в несоответствии типа параметра типу поля.
|
|
Андрей |
Отправлено: 22.09.2004, 09:22 |
|
Не зарегистрирован
|
Для AVC:
Мне действительно надо Memo, т.к. значения ключей может быть> 255 и естественно в Acces поле Varcchar не может быть> 255
В Update я действительно забыл указать Where id=<номер id>
Для olegenty:
Естественно я проверил типы полей и забираю все правильно ... Я тут не один такой кто пытался побиться с этой проблемой ... Поле Memo не победимо |
|
olegenty |
Отправлено: 22.09.2004, 09:27 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот так всегда: отвлёкся на совещание — опоздал с ответом
|
|
Андрей |
Отправлено: 22.09.2004, 09:29 |
|
Не зарегистрирован
|
Для olegenty:
С каким ответом ? Проблема, то так и не решена ... |
|
AVC |
Отправлено: 22.09.2004, 11:15 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Андрей, последнее сообщение olegenty скорее всего было для меня.
Итак резюме.
1. Компонент DBMemo сохраняет Memo достаточно большого размера безо всяких проблем
2. Следующий код то же полностью работоспособен
CODE |
AnsiString ptext = AnsiString::StringOfChar('A',300);
if (!Qry || !Qry->Active || Qry->IsEmpty()) return;
int pk = Qry->FieldByName("ID")->AsInteger;
if (Qry_Work->Active) Qry_Work->Active = false;
Qry_Work->SQL->Text = "Update Andrey Set [Text] = :pText Where ID = " + AnsiString(pk);
Qry_Work->Params->ParamByName("pText")->AsMemo = ptext;
Qry_Work->ExecSQL();
| |
|
Андрей |
Отправлено: 22.09.2004, 11:36 |
|
Не зарегистрирован
|
Для AVC:
У меня конечно тоже работает, просто я забыл сказать, что при выполнении моего запроса 3 раза, на третий выдается ошибка
General SQL Error
[Microsoft][Драйвер ODBC Microsoft Access] Усечение данных строки справа (null)
|
|
AVC |
Отправлено: 22.09.2004, 12:04 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
У меня конечно тоже работает, просто я забыл сказать, что при выполнении моего запроса 3 раза, на третий выдается ошибка
General SQL Error
[Microsoft][Драйвер ODBC Microsoft Access] Усечение данных строки справа (null)
|
Да уж забывчивость.
У меня, оказывается, то же. Причем совершенно бессистемно. Два раза подряд, потом 40 раз без ошибок, потом через раз и т.д.
Считаю что стоит это признать глюком Jet'а. Обернуть Update в try cath отловить его мерзкого и повторить N раз для достижения успеха.
PS. А на DBMemo этого не происходит. Если стану разбираться и чего нарою — сообщу. |
|
Андрей |
Отправлено: 22.09.2004, 12:19 |
|
Не зарегистрирован
|
Для AVC:
Спасибо ... |
|