Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при добавлении записи, TQuery 
:(
    Опции темы
NiJazz
  Дата 12.2.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Делаею выборку:
Код

Query1.SQL.Clear;
Query1.SQL.Add('select * from Table where Id = MyId');
Query1.Open;

Затем, когда вызывается метод Edit или Append, выдается ошибка "Can not modify read only dataset"
Я что-то забыл сделать?
PM MAIL   Вверх
Kesh
Дата 12.2.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 3
Всего: 54



А TUpdateSQL у тебя для TQuery есть?
Добавлено @ 18:44
Может RequestLive стоит в False...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Sett
Дата 13.2.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.12.2004
Где: Подольск

Репутация: нет
Всего: нет



Query1.SQL.Edit;
Query1.SQL.Clear;
Query1.SQL.Edit;
Query1.SQL.Add('select * from Table where Id = MyId');
Query1.Open;
PM MAIL WWW ICQ   Вверх
Vit
Дата 13.2.2005, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(Sett @ 13.2.2005, 06:05)
Query1.SQL.Edit;
Query1.SQL.Clear;
Query1.SQL.Edit;
Query1.SQL.Add('select * from Table where Id = MyId');
Query1.Open;



Что это было? И зачем первые 2 строки?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Bes
Дата 14.2.2005, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Вообще плохо понимаю смысл этого синтаксиса. :-(
Напиши что ты хочешь сделать, а то ты вроде хочешь изменить данные а пишешь select...?
PM MAIL   Вверх
NiJazz
Дата 14.2.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



А SQL.Edit зачем? Свойство SQL - типа TStrings. Перед тем как добавлять запрос, нужно очистить содержимое.
PM MAIL   Вверх
Bes
Дата 14.2.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



ДЛя того, чтобы очистить .SQL надо вызвать clear а не edit.
Кроме того, можно написать SQL.text:='что-то';
Я вообще не пользуюсь edit, post, open и пр. только active чтобы смотреть и ExecSQL чтобы менять.
PM MAIL   Вверх
Vit
Дата 14.2.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Код

Query1.Close;
Query1.SQL.Text:='select * from Table where Id = "MyId"';
Query1.Open;
Query1.Append;
Query1.fieldByName('Id').asstring:='чего-то там';
Query1.Post;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Bes
Дата 15.2.2005, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2Vit: Попутный вопрос:

Query1.Close;
Query1.SQL.Text:='select * from Table where Id = "MyId"';
Query1.Open; // Это равно Query.Active:=true; ?
Query1.Append; // А это команда что, позволяет менять данные при открытом Query?
Query1.fieldByName('Id').asstring:='чего-то там'; // А если ID - несовпадающий счетчик?
Query1.Post; // А изменения видно сразу после этой команды?

P.S. Как-то такой синтаксис мне не очень... :-( Насколько он правилен?

PM MAIL   Вверх
NiJazz
Дата 15.2.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Цитата
Query1.Open; // Это равно Query.Active:=true; ?

Да.
Цитата
Query1.Append; // А это команда что, позволяет менять данные при открытом Query?

Добавляет пустую запись в конец таблицы.
Цитата
Query1.fieldByName('Id').asstring:='чего-то там'; // А если ID - несовпадающий счетчик?

То есть? Тут идёт обращение к полю таблицы по имени и присваивание значения (запись).
Цитата
Query1.Post; // А изменения видно сразу после этой команды?

Если изменения не кэшируются, то идёт физическая запись всех изменений. То есть видно. smile
PM MAIL   Вверх
Bes
Дата 15.2.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Цитата
Query1.fieldByName('Id').asstring:='чего-то там'; // А если ID - несовпадающий счетчик?

То есть? Тут идёт обращение к полю таблицы по имени и присваивание значения (запись).

То есть: есть записи где id = 1, 2, 3, 4, 5
вы создаете "пустую" запись и значение id в ней сразу становится равным 6 т.к. id есть скажем int not null identity unique

дак как вы можете ей присвоить скажем 5? - сама база не даст.....

а про код - я имел ввиду, что насколько логичнее будет писать:

Query.active:=false;
Query.sql.text:='insert into mytab (val1) values (:val1)';
Query.execsql;
Query.sql.text:='select * from mytab';
Query.active:=true;

будет то же самое, а то вы взяли квери, а пользуетесь им как тэйблом. непонятно?
PM MAIL   Вверх
NiJazz
Дата 15.2.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Bes
Цитата
о есть: есть записи где id = 1, 2, 3, 4, 5
вы создаете "пустую" запись и значение id в ней сразу становится равным 6 т.к. id есть скажем int not null identity unique

дак как вы можете ей присвоить скажем 5? - сама база не даст.....

А ты этого не делай. Не присваивай этому полю значений.
Цитата
а про код - я имел ввиду, что насколько логичнее будет писать:

Так меньше вероятность возникновения ошибки при добавлении записи, так как синтаксис проще.

PM MAIL   Вверх
Vit
Дата 15.2.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(Bes @ 14.2.2005, 22:16)
Query1.Append; // А это команда что, позволяет менять данные при открытом Query?


Эта комманда открывает Dataset на запись. Есть так называемые Live Query, или запросы с двунаправленными курсорами. Реально такой запрос ведёт себя точно так же как таблица, с ним можно делать всё что ты делаешь с Table - Edit, Insert, Append.

Цитата(Bes @ 14.2.2005, 22:16)
Query1.fieldByName('Id').asstring:='чего-то там'; // А если ID - несовпадающий счетчик?


Откуда я знаю ID счётчик там в таблице или вообще левое значение, я привёл для примера, если это счётчик то его конечно присваивать нельзя, но по условию задачи нигде не оговаривалось что это счётчик а телепатии я не обучен.

Цитата(Bes @ 14.2.2005, 22:16)
Query1.Post; // А изменения видно сразу после этой команды?


Да

Цитата(Bes @ 14.2.2005, 22:16)
P.S. Как-то такой синтаксис мне не очень... :-( Насколько он правилен?


Он правилен, но пользоваться им надо с БОЛЬШОЙ осторожностью. Такие запросы очень напрягают сервер. При многопользовательском доступе с серверами баз данных такие запросы могут очень сильно блокировать таблицу. Кроме того лучше не применять в случае если Select возвращает очень большой набор данных. В общем вопрос очень тонкий - 100% рекомендаций никто не даст, в одних случаях применение такого запроса очень удобно (например именно это происходит если соединить грид с результатом запроса и в гриде поменять значение или добавить запись), в других это можетт явится источником проблем - это универсальный ответ по поводу целесообразности любого запроса.

Цитата(NiJazz @ 14.2.2005, 23:57)
Если изменения не кэшируются, то идёт физическая запись всех изменений. То есть видно. 


Даже если кэшируются, если использовать доступ через тот же драйвер - всё видно.


Цитата(Bes @ 15.2.2005, 03:06)
про код - я имел ввиду, что насколько логичнее будет писать:

Query.active:=false;
Query.sql.text:='insert into mytab (val1) values (:val1)';
Query.execsql;
Query.sql.text:='select * from mytab';
Query.active:=true;

будет то же самое, а то вы взяли квери, а пользуетесь им как тэйблом. непонятно?


Этот метод для серверных баз предпочтительнее, на локальных через live запрос работа будет быстрее.

Цитата(NiJazz @ 15.2.2005, 03:15)
Так меньше вероятность возникновения ошибки при добавлении записи, так как синтаксис проще.


Не в ошибках дело...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Makarofff
Дата 18.2.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.1.2005

Репутация: нет
Всего: нет



а у меня такая трабла
когда в проге повторно вызываю таблицу пишет
Name not uniaue in this context
помогите плиз
PM MAIL   Вверх
NiJazz
Дата 18.2.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Makarofff
Создавай новую тему.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.