Форум: "Начинающим";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Внизпомогите начать работать с SQL Найти похожие ветки
← →
Fer (2005-11-15 14:14) [0]Народ, плииз огромный.. помогите начать работать на SQL именно под Дэльфи 7
Очень нужно СРОЧНО напистьа прогу.. но я уже в полнмо ауте.
Чтение книг и доков не много прояснили ((((
Объясните кто-нибудь на словах как это нужно делать.
1 - Составить запрос SELECT с WHERE, который отражается в таблице и при этом позволяет редактирвать себя... - у меня как только лсово where - редактирование становится большой проблемой.
2 - Большая непонятность со временным полем в таблице..
Есть поле типа Дата. Как в запросе Select обработать его на предмет не заполненности? Как мне узнать что оно пустое..
where Dat = Nil
where Dat = ""
where Dat = NULL
where Dat = ""
у меня он на всё ругается! Что за формат в дате такой когда поле не заполнено..
3 - и Самый актуальный. Очень прошу объясните на пальцах. Сделал я запрос на выборку. Получил данные, даже немного догадался как к ним обратиться.. но! Как мне скажем после этого сразу же их модифиировать? Хочу запистаь значение в поле строки, или строку с текущим номером удалить. Нужен новый запрос? Как он звучит - что писать, и как писать, чтобы он не ругался что мол запрос не открыт, или данные только для чтения..
Помогите плизз... я уже устал ((((
Андрей
← →
Reindeer Moss Eater © (2005-11-15 14:19) [1]Открой папку Delphi7\Demos\db
← →
ANB © (2005-11-15 14:20) [2]2. where Dat is NULL
← →
Stakan © (2005-11-15 14:23) [3]
>where Dat = Nil
>where Dat = ""
>where Dat = NULL
> where Dat = ""
where Dat is null
> 1 - Составить запрос SELECT с WHERE, который
> отражается в таблице и при этом позволяет редактирвать
> себя... - у меня как только лсово where -
> редактирование становится большой проблемой
Подключить TUpdateSQl и далее в зависимости от конкретных компонент
← →
Sergey13 © (2005-11-15 14:25) [4]2Fer (15.11.05 14:14)
>Очень нужно СРОЧНО напистьа прогу..
Лаба или курсач?
← →
Fer (2005-11-15 14:31) [5]Так... папки нет.. дистрибутив урезаный
TUpdateSQl - хотя бы шаги как и во что его подключать.. Потому как я его уже пытался тыкать.. но полезного не сомг сделать ничего (((
Может куском кода любого с ним поделитесь или в двух словах что да как с ним делать..
Лаба или курсач? - не не лаба и не курсач.. курсач я в своё время в Аксесе на отлично сдал.. но точ бы овт так сесть с Дэльфи... (((
Пасиб огромный. - С датами ща изменю
← →
ANB © (2005-11-15 15:28) [6]
> Fer (15.11.05 14:31) [5]
А зачем парадокс ? ТЗ слегка озвучь. Если для сети - то не стоит на парадоксе базу делать.
← →
Johnmen © (2005-11-15 16:04) [7]>не не лаба и не курсач..
А что тогда, если не секрет?
← →
Vlad © (2005-11-15 16:19) [8]
> Fer (15.11.05 14:31) [5]
> TUpdateSQl - хотя бы шаги как и во что его подключать..
> Потому как я его уже пытался тыкать.. но полезного не сомг
> сделать ничего (((
Похоже справку по TUpdateSQL ты даже не открывал.
по поводу того, "во что" его подключать:
In practical application, a TUpdateSQL object is placed on a data module or form, and linked to a TQuery or TStoredProc component through that component’s UpdateObject property
← →
Виталий Панасенко (2005-11-15 16:21) [9]Вообще-то, конечно, в папке Help Delphi найти LocalSQL... И купить книжку...
WWW.SQL.RU
http://megalib.com/
← →
Fer (2005-11-15 20:33) [10]Query2: TQuery;
UpdateSQL1: TUpdateSQL;
Query2.CachedUpdates := TRUE;
Query2.UpdateObject := UpdateSQL1 ; //хотя и без неё удаляет всё
with Query2 do
begin
Active:=False;
SQL.Clear;
SQL.Add("DELETE FROM " + "bank.db ");
ExecSQL;
end;
Query2.CachedUpdates := FALSE;
Вот так я научился стирать всю таблицу целиком..
Вопрос.. как определить текущую строку?
Нумерации своей нет. Ключевого поля нет. То есть в таблице допускаются две одинаковых записи. Как я понял не все базы(?) ведут внутренюю нумерацию строк таблицы.. Подскажите хотя бы направление...
Как удалять текущую строку?
Таблица формировалась вообще - запросом Query1.
Чтение умной книжки Андрей Сорокина Delphi "Разработка баз данных" не особо помогает...
← →
Vlad © (2005-11-15 20:52) [11]
> Fer (15.11.05 20:33) [10]
У тебя получился некий синтез прочтенного в умных книгах и собственных догадок.
Если удалять методом ExecSQL, то ни CachedUpdates, ни UpdateObject не нужны. Убери их из кода.
Для того чтобы удалить запись из того набора данных, который ты получил с помощью Query, есть метод Query.Delete
Этот метод удаляет текущую запись, т.е. ту, на которой стоит указатель.
Удаление происходит как в клиентском наборе данных(Query), так и в самой базе.
Для этого-то и нужен компонент TUpdateSQL, который используется в сочетании со свойством CachedUpdates = true;
В UpdateSQL ты должен прописать sql запрос на удаление (если нужно только удалять). Тогда метод Query.Delete сможет корректно удалить из базы именно ту запись на которой установлен курсор в твоем ADOQuery
Подробнее читай в книгах, а так же в статьях в интернете.
← →
Fer (2005-11-15 21:04) [12]И ещё если можно.. функции работы с датой в базе данной до сих пор вызывают вопросы..
Пытаюсь написать:
with Query2 do
begin
Active:=False;
SQL.Clear;
SQL.Add("insert into " + "bank.db " +
"(DateZ, Otgruzili)" + "values " + "(:S1, :S2)");
ExecSQL;
end;
Где первое S1 - для поля типа дата - вполне подхоит елис набрать вместо него "01.01.05"
А второе S2 - поле типа Альфа... (по утверждениям дельфиского датабйес дэсктопа) - кушает руками написанное = "334".
А очень хочется туда засовывать данные с элементов управления.
Во что их преобразвывать? TDateTime? String? - ругнулся на оба...
Не совместимый тип. А что туда остаётся ещё засунуть?
← →
Fer (2005-11-15 21:10) [13]Да - за ответы спасибо!
О сути метода догадываюсь... что второй делает то что первый раньше не умел и прочее...
Опять таки.. человеческих экзамплов не попадается... тот один хорший что нарыл использовал уже весь..
Вопрос всё в том же.. Как писать запрос на SQL внутри элемента UpdateSQL - вот что не ясно.. если те же операторы -
DELETE FROM WHERE - то не ясно - как указать что нужно? Таблица не имеет ключей.. записи могут быть одинаковые... снова проблема - узнать где же я стою...
Может курсор какой-то задействовать? И его передавать?
← →
Vlad © (2005-11-15 21:15) [14]
> Fer (15.11.05 21:10) [13]
> Таблица не имеет ключей.. записи могут быть одинаковые..
> .
Это порочная практика.
Придется тебе в таблицу (в обязательном порядке!) добавить уникальное поле автоинкрементного типа (например). Тогда ты сможешь однозначно определить запись, которую тебе нужно удалить.
← →
Fer (2005-11-16 12:53) [15]Спасибо за подсказку.
Пытаюсь ввести ключ - поле с именем N
А значит в запросе на добавление записи нужно узнать максимальное значение этого поля.
Запрос написал.
Как получить результат ввиде числа? Работать как обычно с именем поля не вышло... может кто подскажет?
И второе - как направлять запрос на изменение к UpdateSQL - ???
Снова нужно понять какая строка выбрана...
Каким SQL запросом это делать? Или нужно делать запрос к отображаемой таблице? Тогда каким образом эти данные передать в SQL ? А точнее в UpdateSQL запрос?
может кто поделится примером UpdateSQL запросом. В сети вообще примеров нет.. Или яндекс не нашёл..
← →
Sergey13 © (2005-11-16 12:58) [16]2 [15] Fer (16.11.05 12:53)
А в справку так и не глядел? Ну так хоть кликни два раза по компоненте то. Там по моему и без хелпа все понять можно.
← →
Tomkat (2005-11-16 13:17) [17]
Нумерации своей нет. Ключевого поля нет. То есть в таблице допускаются две одинаковых записи.
Что ж это за БД получится ? Читаем о нормализации таблиц, первичных и внешних ключах ...
← →
msguns © (2005-11-16 13:39) [18]>Fer (16.11.05 12:53) [15]
>А значит в запросе на добавление записи нужно узнать максимальное значение этого поля. Запрос написал.
Как получить результат ввиде числа? Работать как обычно с именем поля не вышло... может кто подскажет?
Для парадокса автоинкремент - чистая "подстава" и может работать лишь в локальном (однопользовательском) варианте. Если надо "узнать" ID ДО вставки записи, следует выполнить запрос и сохранить его в переменной, откуда потом взять для запроса на вставку.
Пример:
var
NewId: LongInt;
begin
NewID := 1;
With TQuery.Create(nil) do
begin
DataBase := ...;
// Запрос на определение нового ID
SQL.Add("Select Max(ID)+1 From Table");
Open;
First;
if RecordCount>0 then NewID := Fields[0].AsInteger;
Close;
// Запрос на вставку записи с полученным ID
SQL.Clear;
SQL.Add("INSERT INTO Table (ID,F1,F2,...) VALUES(:ID,:F1,:F2,...");
ParamByName("ID").AsInteger := NewID;
// Значения "рабочих" полей таблицы для вставляемой записи
ParamByName("F1").As... := ...;
ParamByName("F2").As... := ...;
...
ExecSQL;
Free;
end;
end;
"Запрос на вставку" из примера можно вывести в UpdateSQL
← →
Fer (2005-11-16 14:21) [19]Так - в таблицу добавил поле N - перед каждой записью ищу максимальное значение поля и увеличиваю на единицу.
Затем создаю новую запись с полем N. Заодно поле N прописал ключевым.
Тут заработало! Спасибо огромное!
Но до сих пор ковыряюсь с UpdateSQL.
Куча неясностей (((
по условиям задачи таблица всего одна.
На экран выводится запросом с параметром where, поэтому строкой типа
Query1.Delete; не удаляется.
Тут подсказывают что нужен компонент UpdateSQL.
Поставил такой на форму. Заполнил в нём поля для моей таблицы - указал ключевое поле и обновляемые поля. Он написал запросы на соответсвующих вкладках.
На кнопке юзаю методы:
Query1.CachedUpdates := TRUE;
Query1.UpdateObject := UpdateSQL1 ;
Query1.Delete;
Query1.CachedUpdates := FALSE;
В итоге - прога не вываливается (!!! ура!) но и не удаляет (((
Когад в очередной раз делаю двойной счелчок на компоненте UpdateSQL1 он выдаёт сообщение с кнопкой ОК - ERROR - Enable to determine field names for Query1.
Ощущение, что что-то не так... хотя! - в открывшимся окне таблица пустая, полей нет, имени таблицы нет... но - на вкладках SQL запросов они остаются прописанными.
Вопросы:
1 - правильно ли я использую Query1.Delete; - ? просто прописывается путь Query1.UpdateObject := UpdateSQL1 ; и всё?
2 - этот ERROR при открытии компоненты UpdateSQL1 - глюк который мне сильно мешает жить и так быть не должно?
3 - когда мне понадобится возможность редактировать ту таблицу, как мне нужно будет вызвать Query1 - UpdateRecord ??? а с какими параметрами?
Как писать такой запрос?
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("update bank.db "+
"set Oplacheno =" + "100" where N in (Select N from bank.db where N=2));
Query1.Open;
А где вызов метода UpdateSQL ? или он вызывается не явно при обращении update запроса Query1.
Тогда тут вообще updateRecord не используется...
Если можно, кто-нибудь напишите общий порядок изменения записей в таблице с использованием updateSQL. Хотя бы в двух словах.
Ещё лучше если кто-нибудь дал ссылочку на пример базы работющей с этим методом.
Всем огромное спасибо за ответы.
Очень жду новых
Андрей
← →
Fer (2005-11-17 00:49) [20]Подскажите пожайлуста, как узнать номер поля на которм я стою в таблице (отображении). Что вообще можно узнать от той таблицы?
Ну или каким образом в запросы можно давать указатель на текущую запись в таблице...
← →
Sergey13 © (2005-11-17 09:17) [21]2[20] Fer (17.11.05 00:49)
Не надо тебе для редактирования ничего узнавать у таблицы. Надо правильно заполнить модифицирующие запросы в UpdateSQL1 и после изменения данных вызывать метод ApplyUpdates редактируемого датасета.
>На кнопке юзаю методы:
>Query1.CachedUpdates := TRUE;
>Query1.UpdateObject := UpdateSQL1 ;
>Query1.Delete;
>Query1.CachedUpdates := FALSE;
Выкинь все кроме Query1.Delete; Это указывается в дизайне или в ране при создании.
CachedUpdates должен быть TRUE;
← →
msguns © (2005-11-17 10:41) [22]Работать с датасетами, полученными запросами (не типа TXXTable) можно двумя способами:
1. Средствами собственно того объекта доступа, через который получен отображаемый датасет. В твоем случае это TQuery. Здесь наиболее "популярны" две технологии:
а) "Чисто" методами самого объекта, например TADODataSet, TIBDataSet, TClientDataSet и др. В тех случаях, где это возможно (зависит от типа доступа, характера запроса и др.). В это случае не надо никаких дополнительных объектов или компонент,- все делается методами самого используемого класса (переопределенные, как правило, "дедушкины" методы TDataSet: Append, Insert, Edit, Delete, Post,... При "вызове" этоих методов объект доступа (ОД) самостоятельно решает проблемы с посылкой команд на сервер, подтверждением (отменой), перечиткой обновленных данных с сервера и т.д. Именно для TQuery эта технология недоступна.
б) С использованием дополнительных объектов в случаях "сложных" запросов на извлечение, изменение данных в БД. Один из таких способов (посредством объекта класса TUpdateSQL) ты и пользуешься. Этот способ "изобретен" для тех, кто предпочитает работать по "гридной" технологии, но по какким-то причинам не может этого сделать из-за "отказа" соответствующего TXXDataSet (например, если изменение в решетке записи должно отразиться в изменениях более, чем в одной таблице БД). В этом варианте технологии разработчик должен "подробно" описать соответствующими операторами SQL ЧТО и ГДЕ должно измениться при выполнении соответствующих методов датасета (упомянутых выше Insert,Post,Delte..). Тогда при выполнении любого из этих методов TXXDataSet будет не самостоятельно "базарить" с сервером, а использовать для "беседы" "переводчика" в образе указанного объекта TUpdateSQL , для которого и были даны подробные указания на сей счет.
При этом способе можно использовать кэширование для формирования группы изменений для "пакетного" обновления данных на сервере.
2. Разделять чтение и обновление данных в разных запросах и даже транзакциях. Т.е. отображаемые данные полученв чисто читающим запросом.
Изменение данных выполняется другими запросами, запускаемыми, как правило, в контексте той же транзакции, что и читающаяся. Либо синхронизирующихся с читающей (в зависимости от типа сервера или движка). В программе это выглядит обычно так (для парадокса):
В решетке отражаются записи, полученные TQuery, которые не могут быть отредактированы непосредственно в самой решетке (т.к. не НД нередактируемый). При необходимости внести изменения программа выводит на экран не DB-aware контролы (TEdit,Tcombobox,TMemo и т.д.), которые пользователь заполняет. После чего жмет соотв. кнопку, программа проверяет корректность введенных данных и, если все верно, формирует и запускает динамический запрос (запросы) на изменение данных в БД.
После успешного выполнения запросов отображаемый НД переоткрывается (либо выполняется извлечение только измененных записей - зависит опять же от использованного метода доступа и типа БД) и, если нужно, позиционируется на введенную (измененную) запись (вот для чего в том числе используют UID). Этот способ более "совершенен" по сравнению с "датасетовским", т.к. разработчик никак не ограничен в инструментах и алгоритмах "копания" в БД.
Однако считается неудобным с т.зр. пользователя, привыкшего к "эксельной" технологии правки таблиц. Кроме того, требует уже не "шапочного" знакомства с особенностями работы сервера или движка (в частности, понимания транзакций, изоляций, блокировок, конфликтов и т.д.)
Для сиквель-серверов часто сложные алгоритмы правки в БД (например, цепочки изменений, каскады и т.д.) переносят на сервер, "облегчая" и упрощая клиента и повышая логическую целостность и надежность пакетов изменений.
Какую технологию выбрать - ИМХО, надо решать в каждом конкретном случае, находя разумный компромисс между сложностью реализации, удобством пользователя и надежностью, скоростью и целостностью БД.
← →
Дева © (2005-11-17 12:09) [23]Не знаю, лично я для удаления использовала
Query1.Delete
удаляет текущее,
а так через TQuery через параметризированный запрос ИМХО проще
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c