Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 13:51   #11
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Попробовать можно так:
Код:
insert into Data (...)
select :FIO,...
from Data where not exists(SELECT * FROM Data WHERE Name=:FIO)
подкрутить чего-то еще надо, на тестах посмотреть ...

Цитата:
с запросами без визулизации
Open к визулизации не имеет никакого отношения.

Последний раз редактировалось Аватар; 22.08.2015 в 19:36.
eval вне форума Ответить с цитированием
Старый 31.10.2012, 13:58   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от eval
Open к визулизации не имеет никакого отношения.
+1100500!

Dux, ADOQuery - это НЕ ВИУЗАЛЬНЫЙ компонент! Всё, что Вы с ним делаете - скрыто и никто этого не видит! Другое дело, если Вы кинули на форму DataSource и связали ВИЗУАЛЬНЫЕ компонент (например, DBGrid) через датасоурс с вашим ADOQuery! Но это же ВЫ сделали, Вас никто не заставляет это делать...

значит так. Киньте на форуму ещё один TADOQuery (ну, пусть для простоты это будет ADOQuery2), свяжите его с ADOConnection (если Вы её используете для доступа к БД). Занесите в ADOQuery2 нужный запрос и вызывайте ADOQuery2.Open для проверки наличия записи... Никакой визуальности при этом не будет, гарантирую!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2012, 13:59   #13
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
+1100500!

Dux, ADOQuery - это НЕ ВИУЗАЛЬНЫЙ компонент! Всё, что Вы с ним делаете - скрыто и никто этого не видит! Другое дело, если Вы кинули на форму DataSource и связали ВИЗУАЛЬНЫЕ компонент (например, DBGrid) через датасоурс с вашим ADOQuery! Но это же ВЫ сделали, Вас никто не заставляет это делать...

значит так. Киньте на форуму ещё один TADOQuery (ну, пусть для простоты это будет ADOQuery2), свяжите его с ADOConnection (если Вы её используете для доступа к БД). Занесите в ADOQuery2 нужный запрос и вызывайте ADOQuery2.Open для проверки наличия записи... Никакой визуальности при этом не будет, гарантирую!
Большое спасибо за дельный совет! Так и сделаю!
Dux вне форума Ответить с цитированием
Старый 22.08.2015, 13:25   #14
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Тема довольно старое , Но я захотел такой проверка и написал так
MS SQL работаю через SDAC
Код:
create database DB1;
----------------
use DB1
----------------------
create table Tab1(t_id int identity(1,1),
                  t_name nvarchar(30)
                  )
-----------------------
--drop table Tab2
create table Tab2(t_id int,
                  t_name nvarchar(30)
                  )
----------------------
insert into Tab1(t_name) values(N'Чай');
insert into Tab1(t_name) values(N'Кофе');
insert into Tab1(t_name) values(N'Сахар');
Код:
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    MSConnection1: TMSConnection;
    MSQuery1: TMSQuery;  // Для Tab1
    MSDataSource1: TMSDataSource;
    MSQuery2: TMSQuery; // Для Tab2
    MSDataSource2: TMSDataSource;
    msqryINSERT: TMSQuery; // С этим делаю проверка и если нету такой запись то insert
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 with msqryINSERT do
 begin
   SQL.Text := ' select *  '+
               ' from Tab1 inner join Tab2  '+
               ' on Tab1.t_id=Tab2.t_id     '+
               ' and Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';
   Open;
 end ;
 if msqryINSERT.RecordCount<>0 then
 begin
   ShowMessage('Такой запись уже есть на Tab2');
 end
 else
 if msqryINSERT.RecordCount=0  then
  with msqryINSERT do
  begin
    SQL.Clear;
    SQL.Text := ' INSERT Tab2 (t_id, t_name)  '+
                ' SELECT t_id, t_name         '+
                ' FROM Tab1                   '+
                ' WHERE Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';
    ExecSQL;
    MSQuery2.Refresh;
  end;
end;

end.
Можно так да ?

Последний раз редактировалось xxbesoxx; 22.08.2015 в 13:32.
xxbesoxx вне форума Ответить с цитированием
Старый 22.08.2015, 14:07   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно. А так не проще проверочный запрос
Код:
SQL.Text := ' select 0 from Tab2  where t_id='+ MSQuery1.FieldByName('t_id').AsString;
И для многопользовательской работы такая проверка не гарантирует отсутствие проблем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.08.2015, 14:57   #16
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
И для многопользовательской работы такая проверка не гарантирует отсутствие проблем
Почему друг ? Я же все это проверяю SQL помощью JOIN , смотрите когда вы думайте что проверка может не будет правильны ?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Application.MessageBox(PChar('Вы действительно хотите это запись вставить на Tab2 ?  :  '+
  MSQuery1.FieldByName('t_name').AsString ), 'Предупреждение !!!', MB_ICONWARNING+MB_YESNO)=IDYES then
 begin
 with msqryINSERT do
 begin
   SQL.Text := ' select *  '+
               ' from Tab1 inner join Tab2  '+ // Здесь    JOIN
               ' on	Tab1.t_id=Tab2.t_id     '+
               ' and Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +''; // Вот здесь на каком записе есть курсор
   Open;
 end ;

 if msqryINSERT.RecordCount<>0 then   // А здесь если есть такой запись на Tab2 тоже  RecordCount не будет "0"
 begin
   ShowMessage('Такой запись уже есть на Tab2'); //
 end
 else
 if msqryINSERT.RecordCount=0  then  // А если Tab2 нету такой запись , тогда  RecordCount будет "0" да ?
  with msqryINSERT do   // Начинаю INSERT
  begin
    SQL.Clear;
    SQL.Text := ' INSERT Tab2 (t_id, t_name)  '+
                ' SELECT t_id, t_name         '+
                ' FROM Tab1                   '+
                ' WHERE Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';  // тоько те запись где курсор стаит
    ExecSQL;
    MSQuery2.Refresh;
  end;
end;
end;

end.

Последний раз редактировалось xxbesoxx; 22.08.2015 в 15:07.
xxbesoxx вне форума Ответить с цитированием
Старый 22.08.2015, 19:24   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Почему
Потому, что какой-то Вася успеет создать запись между SELECT-ом и INSERT-ом. Уникальность нужно на уровне СУБД контролировать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.08.2015, 20:59   #18
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Потому, что какой-то Вася успеет создать запись между SELECT-ом и INSERT-ом
Да вы прав, мои SELECT вернул "0" , Я получаю msqryINSERT.RecordCount=0 и этот момент "Вася Пупкин" успел делать INSERT и еще из моего приложения запускается INSERT ...в этом конечно вы прав .! А можно вопрос : как реализовать на уровне СУБД ??? Так образно скажите пожалуйста для иллюстраций
xxbesoxx вне форума Ответить с цитированием
Старый 22.08.2015, 21:26   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Уникальный индекс по полю или группе полей однозначно обеспечит уникальность. По сути это альтернативный ключ. Обычно конечно клиентская проверка, как в примерах выше. Она отсечет львиную долю дублей. Можно на уровне SQL-процедуры или триггера аналогичный контроль сделать с теми же проблемами. Еще вариант соответствующих блокировок, но это тормоза
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.08.2015, 03:42   #20
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Уникальный индекс по полю
Делал да
Код:
create nonclustered index IN_Tab2
on  Tab2(t_id, t_name)
Цитата:
или триггера аналогичный контроль
Огромное вам спасибо мне понравился триггер , вот так разобрал и работает
Код:
CREATE TRIGGER TR_INSERT_COUNT
ON Tab2
AFTER INSERT
AS
IF (SELECT COUNT (*) FROM Tab2 T, inserted I WHERE T.t_id=I.t_id)>1
BEGIN
ROLLBACK TRAN
 PRINT N'Такой запись уже есть на Tab2'
END
А через Delphi убираю это проверка SELECT JOIN и msqryINSERT.RecordCount=0 вот оставляю так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Application.MessageBox(PChar('Вы действительно хотите это запись вставить на Tab2 ?  :  '+
  MSQuery1.FieldByName('t_name').AsString ), 'Предупреждение !!!', MB_ICONWARNING+MB_YESNO)=IDYES then
 begin
  with msqryINSERT do   // Начинаю INSERT
  begin
    SQL.Clear;
    SQL.Text := ' INSERT Tab2 (t_id, t_name)  '+
                ' SELECT t_id, t_name         '+
                ' FROM Tab1                   '+
                ' WHERE Tab1.t_id= '+ MSQuery1.FieldByName('t_id').AsString +'';  // тоько те запись где курсор стаит
    ExecSQL;
    MSQuery2.Refresh;
  end;
end;
end;

end.

Последний раз редактировалось xxbesoxx; 23.08.2015 в 04:24.
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[B]Как проверить базу на наличие слов?[/B] Михаил Наимов PHP 1 02.05.2012 08:11
TDBDateEdit как проверить на наличие значения? delphicoding Общие вопросы Delphi 6 03.04.2012 11:34
Как проверить наличие программы googl Общие вопросы Delphi 13 22.03.2012 16:14
как проверить наличие папки на удаленном сервере? xxxsas PHP 4 18.01.2011 16:16
как проверить наличие определенного текста в строке jihot Общие вопросы Delphi 6 04.04.2010 18:40