Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1131337689
Lkan
2005-11-07 07:28
2005.12.04
дбф в еxe-шник


2-1132216159
pavel_guzhanov
2005-11-17 11:29
2005.12.04
Использование таймера


14-1132128896
Ushadow
2005-11-16 11:14
2005.12.04
Проблема с запуском windows при смене матплаты


14-1131905287
Виталий11111
2005-11-13 21:08
2005.12.04
Вопрос по массивам


14-1132024353
Glosariy
2005-11-15 06:12
2005.12.04
ПОМОГИТЕ ПОЖАЛУЙСТА ОЧЕНЬ НУЖНО!!!!!!! Поиск в базе данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский