![]() |
|
|
![]()
|
|
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Делаею выборку:
Затем, когда вызывается метод Edit или Append, выдается ошибка "Can not modify read only dataset" Я что-то забыл сделать? |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 3 Всего: 54 |
А TUpdateSQL у тебя для TQuery есть?
Добавлено @ 18:44 Может RequestLive стоит в False... -------------------- ![]() |
|||
|
||||
| Sett |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 20.12.2004 Где: Подольск Репутация: нет Всего: нет |
Query1.SQL.Edit;
Query1.SQL.Clear; Query1.SQL.Edit; Query1.SQL.Add('select * from Table where Id = MyId'); Query1.Open; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Что это было? И зачем первые 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 |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
Вообще плохо понимаю смысл этого синтаксиса. :-(
Напиши что ты хочешь сделать, а то ты вроде хочешь изменить данные а пишешь select...? |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
А SQL.Edit зачем? Свойство SQL - типа TStrings. Перед тем как добавлять запрос, нужно очистить содержимое.
|
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 806 Регистрация: 8.12.2004 Репутация: 2 Всего: 7 |
ДЛя того, чтобы очистить .SQL надо вызвать clear а не edit.
Кроме того, можно написать SQL.text:='что-то'; Я вообще не пользуюсь edit, post, open и пр. только active чтобы смотреть и ExecSQL чтобы менять. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
-------------------- 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 |
|||
|
||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. Как-то такой синтаксис мне не очень... :-( Насколько он правилен? |
|||
|
||||
| NiJazz |
|
||||||||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Да.
Добавляет пустую запись в конец таблицы.
То есть? Тут идёт обращение к полю таблицы по имени и присваивание значения (запись).
Если изменения не кэшируются, то идёт физическая запись всех изменений. То есть видно. |
||||||||
|
|||||||||
| Bes |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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; будет то же самое, а то вы взяли квери, а пользуетесь им как тэйблом. непонятно? |
|||
|
||||
| NiJazz |
|
||||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Bes
А ты этого не делай. Не присваивай этому полю значений.
Так меньше вероятность возникновения ошибки при добавлении записи, так как синтаксис проще. |
||||
|
|||||
| Vit |
|
||||||||||||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Эта комманда открывает Dataset на запись. Есть так называемые Live Query, или запросы с двунаправленными курсорами. Реально такой запрос ведёт себя точно так же как таблица, с ним можно делать всё что ты делаешь с Table - Edit, Insert, Append.
Откуда я знаю ID счётчик там в таблице или вообще левое значение, я привёл для примера, если это счётчик то его конечно присваивать нельзя, но по условию задачи нигде не оговаривалось что это счётчик а телепатии я не обучен.
Да
Он правилен, но пользоваться им надо с БОЛЬШОЙ осторожностью. Такие запросы очень напрягают сервер. При многопользовательском доступе с серверами баз данных такие запросы могут очень сильно блокировать таблицу. Кроме того лучше не применять в случае если Select возвращает очень большой набор данных. В общем вопрос очень тонкий - 100% рекомендаций никто не даст, в одних случаях применение такого запроса очень удобно (например именно это происходит если соединить грид с результатом запроса и в гриде поменять значение или добавить запись), в других это можетт явится источником проблем - это универсальный ответ по поводу целесообразности любого запроса.
Даже если кэшируются, если использовать доступ через тот же драйвер - всё видно.
Этот метод для серверных баз предпочтительнее, на локальных через live запрос работа будет быстрее.
Не в ошибках дело... -------------------- 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 |
||||||||||||||
|
|||||||||||||||
| Makarofff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.1.2005 Репутация: нет Всего: нет |
а у меня такая трабла
когда в проге повторно вызываю таблицу пишет Name not uniaue in this context помогите плиз |
|||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Makarofff
Создавай новую тему. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |