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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2012, 20:31   #1
Dandy777
Пользователь
 
Регистрация: 04.09.2012
Сообщений: 25
По умолчанию Предотвращение дублирования записи

Подскажите пожалуйста как сделать проверку на наличие записи

Delphi + MSSQL

Пытаюсь организовать через Stored Procedure:

Код:
USE [PlatSys]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[EXISTS_USER] 

@LastName nvarchar

AS
BEGIN

	SET NOCOUNT ON;

IF EXISTS (SELECT LastName FROM Users WHERE LastName LIKE '%' + @LastName + '%' )
BEGIN
Print N'1';
END
END
И потом в Delphi


Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
DataModule1.Exists.Close;
DataModule1.Exists.ProcedureName:='EXISTS_USER';
DataModule1.Exists.Parameters.Refresh;
DataModule1.Exists.Parameters.ParamByName('@LastName').Value:=Edit1.Text;
DataModule1.Exists.Open;
end;
Но получаю ошибку


Если выполнить процедуру на сервере то ReturnValue = 0 хотя такая запись в таблице есть.

P.S. Учусь совсем недавно, посему за возможную кривоватость кода просьба не пинать, а отнестись с пониманием. В интернете искал решение проблемы и то ли плохо искал, то ли не оказалось того что мне нужно.
Dandy777 вне форума Ответить с цитированием
Старый 17.09.2012, 20:39   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В процедуре SELECT-ом верните результат, например
Код:
SELECT COUNT(*) AS CountRec FROM Users WHERE LastName LIKE '%' + @LastName + '%'
В результате получите набор из одной записи и одного поля в ней. Но этого мало. После проверки и перед вставкой новой записи при многопользователькой работе дубликаты могут появится. Тут триггер не заменим
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2012, 20:46   #3
Dandy777
Пользователь
 
Регистрация: 04.09.2012
Сообщений: 25
По умолчанию

С триггерами еще не успел познакомиться. Но если он не заменим, то придется осилить.
Вы думаете подойдет
Код:
SELECT Count
если в сообщении мне надо вернуть что-то типа
"Пользователь Иванов Иван Иванович существует, продолжить создание пользователя" Yes/No
Dandy777 вне форума Ответить с цитированием
Старый 17.09.2012, 21:12   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А програамно это же сообщение выдать если FieldByName('CountRec').AsInteger>0 нельзя? Или обязательно серверное сообщение?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2012, 22:36   #5
Dandy777
Пользователь
 
Регистрация: 04.09.2012
Сообщений: 25
По умолчанию

1) Хотелось бы реализовать через Stored Procedure.
2) Как реализовать программно в Delphi я знаю.

P.S. Я ооочень сильно извиняюсь, сказался вечер и усталость. Немного не правильно сформулировал задачу.

Из таблицы выбирается ФИО, допускается совпадение:
Фамилия и Фамилия + Имя, но не допускается совпадение Фамилия + Имя + Отчество.
Подскажите как такое реализовать?
Dandy777 вне форума Ответить с цитированием
Старый 17.09.2012, 22:43   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BTW, если создадите индекс на данную таблицу, куда включите все три поля (Фамилия, Имя, Отчество) и сделаете этот индекс уникальным, то НИКТО не сможет добавить повторяющийся элемент в таблицу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.09.2012, 07:08   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Скорее всего ТС хранит в таблице в одном поле и фамилию и имя и отчество. Этого нельзя делать. Надо делать как сказал Serge_Bliznykov. Тогда все будет просто и правильно.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 18.09.2012, 08:09   #8
Dandy777
Пользователь
 
Регистрация: 04.09.2012
Сообщений: 25
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Скорее всего ТС хранит в таблице в одном поле и фамилию и имя и отчество. Этого нельзя делать. Надо делать как сказал Serge_Bliznykov. Тогда все будет просто и правильно.
Я храню ФИО в 3-х разных полях.

Последний раз редактировалось Dandy777; 18.09.2012 в 09:37. Причина: подправил смысл.
Dandy777 вне форума Ответить с цитированием
Старый 18.09.2012, 08:22   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Я не утверждал наверняка, а предположил. Поэтому и написал, что Скорее всего
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 18.09.2012, 09:39   #10
Dandy777
Пользователь
 
Регистрация: 04.09.2012
Сообщений: 25
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Я не утверждал наверняка, а предположил. Поэтому и написал, что Скорее всего
Не дочитал

Сегодня с новыми силами попробую реализовать через SP , если не выйдет придется реализовывать средствами Delphi. Для моего понимания это будет проще, хотя менее интересно.
Dandy777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срипт для дублирования sergunya233 JavaScript, Ajax 1 07.06.2010 12:57
Утилита низкоуровнего копирования(дублирования) дисков 2def Помощь студентам 0 18.12.2009 03:34
Предотвращение отрицательной позиции. Alex Cones Общие вопросы Delphi 4 27.07.2009 13:43
Предотвращение ошибки Vladya Помощь студентам 5 02.06.2009 19:23