Sql, проверка транзакции подтверждена, возвращаемое значение - PullRequest
0 голосов
/ 30 января 2019

Я хочу добавить нового пользователя (адрес электронной почты) в таблицу пользователей.В случае успеха (без дублирования) вставьте основные конфигурации для нового пользователя в другие таблицы и верните некоторые данные клиенту.Если не удалось, получите соответствующее уведомление в наборе данных в проекте c #.

Вот пример кода, чтобы вы могли легко прокомментировать его

ALTER PROCEDURE [dbo].[CreateUser] 
  @Email nvarchar(256),   
  @Password nvarchar(256)   
AS
BEGIN
  declare @UserID uniqueidentifier;
  declare @ConfigID uniqueidentifier;
  declare @TopMostNode uniqueidentifier;

  BEGIN TRANSACTION;
    select @UserID = NEWID();
    select @ConfigID = newid();

    insert into Users (UserID,Email,Password,CurrentConfig) 
      values(@UserID, @Email, @Password, @ConfigID);

    INSERT INTO Configs (ConfigID, OwnerID, DisplayName, LastPrintID)
      VALUES (@ConfigID,@UserID, 'Default Config', 1);

  COMMIT TRANSACTION 
END

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Этот код почти завершен.Просто нужно добавить SELECT, чтобы вернуть новые ключи.В случае ошибки вы получите исключение.EG:

ALTER PROCEDURE [dbo].[CreateUser] 
  @Email nvarchar(256),   
  @Password nvarchar(256)   
AS
BEGIN
  declare @UserID uniqueidentifier;
  declare @ConfigID uniqueidentifier;
  declare @TopMostNode uniqueidentifier;

  BEGIN TRANSACTION;
    select @UserID = NEWID();
    select @ConfigID = newid();

    insert into Users (UserID,Email,Password,CurrentConfig) 
      values(@UserID, @Email, @Password, @ConfigID);

    INSERT INTO Configs (ConfigID, OwnerID, DisplayName, LastPrintID)
      VALUES (@ConfigID,@UserID, 'Default Config', 1);

  COMMIT TRANSACTION 
  select @UserID UserID, @ConfigID ConfigID;
END
0 голосов
/ 30 января 2019

Здесь есть одна возможность, когда вы возвращаете набор записей с требуемыми данными и флаг, указывающий, существует ли пользователь уже или нет.

alter procedure [dbo].[CreateUser]
(
  @Email nvarchar(256)  
  , @Password nvarchar(256)
)
as
begin
  declare @UserID uniqueidentifier, @ConfigID uniqueidentifier, @TopMostNode uniqueidentifier, @UserExists bit = 0;

  select @UserID = UserID, @UserExists = 1 from Users where Email = @Email;

  if @UserExists = 0 begin
    begin transaction;
      set @UserID = newid();
      set @ConfigID = newid();

      insert into Users (UserID, Email, [Password], CurrentConfig) 
        values (@UserID, @Email, @Password, @ConfigID);

      insert into Configs (ConfigID, OwnerID, DisplayName, LastPrintID)
        values (@ConfigID, @UserID, 'Default Config', 1);

    commit transaction 
  end

  -- Return whether the user already exists or not and the user id
  select @UserExists, @UserId

  return 0;
end

Другой способ вернуть данные в приложение - использовать output параметры, например

alter procedure [dbo].[CreateUser]
(
  @Email nvarchar(256)  
  , @Password nvarchar(256)
  , @UserId uniqueidentifier out
  , @UserExists bit out
)
as
begin
  declare @ConfigID uniqueidentifier, @TopMostNode uniqueidentifier;

  set @UserExists = 0;

  select @UserID = UserID, @UserExists = 1 from Users where Email = @Email;

  if @UserExists = 0 begin
    begin transaction;
      set @UserID = newid();
      set @ConfigID = newid();

      insert into Users (UserID, Email, [Password], CurrentConfig) 
        values (@UserID, @Email, @Password, @ConfigID);

      insert into Configs (ConfigID, OwnerID, DisplayName, LastPrintID)
        values (@ConfigID, @UserID, 'Default Config', 1);

    commit transaction 
  end

  return 0;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...