C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблема обновления, SQL
Андрей
  Отправлено: 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 не победимо sad.gif
olegenty
Отправлено: 22.09.2004, 09:27


Ветеран

Группа: Модератор
Сообщений: 2412



вот так всегда: отвлёкся на совещание — опоздал с ответом biggrin.gif
Андрей
Отправлено: 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)

sad.gif
AVC
Отправлено: 22.09.2004, 12:04


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

У меня конечно тоже работает, просто я забыл сказать, что при выполнении моего запроса 3 раза, на третий выдается ошибка

General SQL Error

[Microsoft][Драйвер ODBC Microsoft Access] Усечение данных строки справа (null)

Да уж забывчивость. biggrin.gif

У меня, оказывается, то же. Причем совершенно бессистемно. Два раза подряд, потом 40 раз без ошибок, потом через раз и т.д.
Считаю что стоит это признать глюком Jet'а. Обернуть Update в try cath отловить его мерзкого и повторить N раз для достижения успеха.

PS. А на DBMemo этого не происходит. Если стану разбираться и чего нарою — сообщу.
Андрей
Отправлено: 22.09.2004, 12:19


Не зарегистрирован







Для AVC:

Спасибо ...

Вернуться в Работа с базами данных в C++Builder