fwr Ответов: 2

Как избежать дублирования записей с помощью процедуры хранения.


Я хочу написать процедуру хранения, чтобы вставить данные в таблицу, а также проверить, существует ли уже одно и то же имя пользователя?
Если да,то исключение throw as useralrady существует.

Я написал процедуру хранения как:
ALTER PROCEDURE [dbo].[Useradd]
@username varchar(20),
@pword nvarchar(20),
@empname varchar(20),
@email nvarchar(50),
@designation varchar(20),
@reportto varchar(20),
@result int output
AS
SELECT * FROM Users WHERE username= @username
BEGIN 
IF EXISTS(SELECT * FROM Users WHERE username= @username)
SET @result = 1
ELSE
SET @result = 0 
INSERT INTO Users(username,pword,empname,email,designation,reportto)
 VALUES(@username,@pword,@empname,@email,@designation,@reportto)
END 


Он успешно компилируется, но не работает в моем коде c#, как я хочу.
Правильно это или нет?
Как я могу использовать этот параметр @result в коде c#?

Пожалуйста, веди меня.

TheyCallMeMrJames

Почему бы вам просто не поставить уникальное ограничение на столбец вашего имени пользователя в таблице?

Dalek Dave

Отредактировано для грамматики и удобочитаемости.

2 Ответов

Рейтинг:
1

Member 14126984

ваш код верен, просто верните значение @result и передайте его своему методу в C# для ex. int id=insertdetails(); где insertdetails-это метод в 3-уровневой архитектуре
здесь вы можете писать, если условие, если id 1 "Детали уже существовали еще"детали вставлены"

ALTER PROCEDURE [dbo].[Useradd]
@username varchar(20),
@pword nvarchar(20),
@empname varchar(20),
@email nvarchar(50),
@designation varchar(20),
@reportto varchar(20),
@result int output
AS
BEGIN 
IF EXISTS(SELECT * FROM Users WHERE username= @username)
SET @result = 1
return @result
ELSE
SET @result = 0 
return @result
INSERT INTO Users(username,pword,empname,email,designation,reportto)
 VALUES(@username,@pword,@empname,@email,@designation,@reportto)
END



вот и все
я думаю, это вам поможет.
спасибо,
Мохан Кишор.


CHill60

А ты нет return параметр, который был определен как output - вы присваиваете ему значение, и вызывающий код должен забрать его из списка параметров. Это особенно важно, если учесть, что вы можете возвращать только тип int из хранимой процедуры. MS, как правило, просто возвращают 0 из своих хранимых процедур, чтобы указать успех (ненулевое значение указывает на неудачу). Кроме того, и вы, и ОП упустили тот факт, что вы всегда будете вставлять данные в таблицу, независимо от того, существует ли уже is или нет, потому что IF / ELSE может выполнить только один оператор. Ваш код фактически сгенерирует ошибку "неправильный синтаксис рядом с ключевым словом "ELSE""
Лучше бы так и было

ALTER PROCEDURE [dbo].[Useradd]
	@username varchar(20),
	@pword nvarchar(20),
	@empname varchar(20),
	@email nvarchar(50),
	@designation varchar(20),
	@reportto varchar(20),
	@result int output
AS
BEGIN 
	IF EXISTS(SELECT * FROM Users WHERE username= @username)
		SET @result = 1
	ELSE
	BEGIN
		SET @result = 0 
		INSERT INTO Users(username,pword,empname,email,designation,reportto)
		VALUES(@username,@pword,@empname,@email,@designation,@reportto)
	END
	return @result
END

Richard Deeming

На самом деле, эта версия будет никогда вставьте данные, так как обе ветви return прежде чем добраться до INSERT заявление. :)

CHill60

О, черт возьми. Как же я мог ошибиться? Снова. Не отвечай на этот вопрос! :-)
Спасибо за поправку

Рейтинг:
0

Sandeep Mewara

Свой путь объявлять параметр @получен неправильный результат.
Правильный способ объявления локальной переменной-это:

DECLARE @result int -- in body after AS


На самом деле вам это не нужно, основываясь на вашем сценарии. Попробуйте что-нибудь вроде:
CREATE PROCEDURE [dbo].[Useradd]
      @username varchar(20),
      @pword nvarchar(20),
      @empname varchar(20),
      @email nvarchar(50),
      @designation varchar(20),
      @reportto varchar(20)
AS

  IF (SELECT COUNT(*) FROM Users WHERE username= @username) < 1
    BEGIN   
      INSERT INTO Users(username,pword,empname,email,designation,reportto)    
      VALUES(@username,@pword,@empname,@email,@designation,@reportto)
    END


ОБНОВЛЕНИЕ: Изменил условие подсчета с >0 на <1


Yusuf

Ваша процедура должна была проверить наличие < 0. так как теперь она будет вставляться только в том случае, если имя пользователя существует, а это не то, что просил ОП.

hitesh darji

хороший..

Sandeep Mewara

Спасибо, мой плохой!
Кстати, не < 0.... он должен быть меньше < 1 :)

fwr

Спасибо, сэр!! теперь он работает должным образом.

Sandeep Mewara

Приятно знать, что это помогло и работает.

mohangbits

лучший из них :)

Dalek Dave

хороший ответ.

CHill60

OP не объявлял локальную переменную, они были (правильно) объявлены выходным параметром