c# - 当插入结果没有显示时,如何检查值是否被插入到表中?
问题描述
我遇到了一个关于应该将数据插入三个表的 SQL Server 过程的问题。下面的代码显示该过程接受参数,然后将所述参数插入到三个表中:一个Address
表、一个D.O.B
表和一个Users
表。
忽略与其他东西有关的盐,我的问题是,当我从 ASP.NET MVC 文件运行此过程时,表中没有插入任何内容Users
,即使Address
和D.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 进行散列但是我决定恢复到何时它工作正常,但你可以看到我失败了。
解决方案
似乎您可能需要几个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
条款的评论。
推荐阅读
- julia - 如何从 Julia 的字典中获取空条目?
- python - vs代码的乌龟问题
- python - 使用 scrapy 概念抓取电子商务网站
- ruby-on-rails - 带有文件上传的 rspec API 数据
- javascript - Splide.js 滑块上的多个进度条
- office-js - 如何在office js中隐藏评论?
- django - 使用 ldap3 进行 django 身份验证
- laravel - foreach 循环的数据返回空但表 laravel 8 中有数据
- java - 在应用更新中播放核心,在生产版本中提供 UPDATE_NOT_AVAILABLE
- html - 防止绝对 div(随 ScrollTrigger 移动)拉长页面