首页 > 解决方案 > 当插入结果没有显示时,如何检查值是否被插入到表中?

问题描述

我遇到了一个关于应该将数据插入三个表的 SQL Server 过程的问题。下面的代码显示该过程接受参数,然后将所述参数插入到三个表中:一个Address表、一个D.O.B表和一个Users表。

忽略与其他东西有关的盐,我的问题是,当我从 ASP.NET MVC 文件运行此过程时,表中没有插入任何内容Users,即使AddressD.O.B表都插入了各自的值。我之前遇到过类似的问题,但问题已解决,因为问题是当我对其使用 HASHBYTES 过程时,其中一个值返回 NULL,但是,我认为没有什么可以做类似的事情。

ALTER PROCEDURE [dbo].[StoreDetails]
    @FirstName VARCHAR(50),
    @Surname VARCHAR(50),
    @Password VARCHAR(100),
    @PhoneNumber VARCHAR(50),
    @Email VARCHAR(100), 
    @IsAdmin BIT,
    @Address VARCHAR(100),
    @DOB DATE
AS
BEGIN 
    SET NOCOUNT ON

    DECLARE @Salt UNIQUEIDENTIFIER = NEWID()

    INSERT INTO dbo.OAddress(Address)
    VALUES (@Address)

    INSERT INTO dbo.ODOB(DOB)
    VALUES (@DOB)

    INSERT INTO dbo.OUsers (FirstName, Surname, Password, Salt, PhoneNumber, Email, IsAdmin, AddressID, DOBID)
    VALUES (@FirstName, @Surname, @Password, @Salt, @PhoneNumber, @Email, @IsAdmin, SCOPE_IDENTITY(), SCOPE_IDENTITY())
END

我相信这方面的 C# 确实按预期工作,因为不久前我设法让这段代码工作,直到我更改存储过程以尝试更改Password参数以使用 HASHBYTES 进行散列但是我决定恢复到何时它工作正常,但你可以看到我失败了。

标签: c#sql-servermodel-view-controller

解决方案


似乎您可能需要几个OUTPUT子句和一些表变量:

ALTER PROCEDURE [dbo].[StoreDetails] @FirstName varchar(50),
                                     @Surname varchar(50),
                                     @Password varchar(100),
                                     @PhoneNumber varchar(50),
                                     @Email varchar(100),
                                     @IsAdmin bit,
                                     @Address varchar(100),
                                     @DOB date
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Salt uniqueidentifier = NEWID();
    DECLARE @AddressID table (ID int);
    DECLARE @DOBID table (ID int);

    INSERT INTO dbo.OAddress ([Address])
    OUTPUT inserted.ID
    INTO @AddressID (ID) --Guessed named for inserted
    SELECT @Address;

    INSERT INTO dbo.ODOB (DOB)
    OUTPUT inserted.ID
    INTO @DOBID (ID) --Guessed named for inserted
    SELECT @DOB;

    INSERT INTO dbo.OUsers (FirstName,
                            Surname,
                            Password,
                            Salt,
                            PhoneNumber,
                            Email,
                            IsAdmin,
                            AddressID,
                            DOBID)
    SELECT @FirstName,
           @Surname,
           @Password,
           @Salt,
           @PhoneNumber,
           @Email,
           @IsAdmin,
           A.ID,
           D.ID
    FROM @AddressID A
         CROSS JOIN @DOBID D;
END;

请注意我对OUTPUT条款的评论。


推荐阅读