gpt4 book ai didi

sql - 插入两个有关系的表的存储过程?

转载 作者:行者123 更新时间:2023-12-05 00:38:17 25 4
gpt4 key购买 nike

我试图将一个新行插入到两个有关系的表中。我写的存储过程如下。

ALTER PROCEDURE InsertUserProfile
(
@UserID varchar(10),
@Pass varchar(50),
@Enabled int,
@Permission int,
@Rank int,
@FName varchar(50),
@LName varchar(50),
@Phone varchar(50),
@Email1 varchar(50),
@Email2 varchar(50)
)
AS

BEGIN TRANSACTION
INSERT INTO tbl_user_login VALUES (@UserID, @Pass, @Enabled, @Permission, @Rank)
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END


INSERT INTO tbl_user_profile VALUES (@FName, @LName, @Phone, @Email1, @Email2)
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END

COMMIT

从此遵循 ASP.NET 代码
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString);
SqlCommand cmd = new SqlCommand("dbo.InsertUserProfile", sqlConn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@UserID", DbType.String).Value = txtUserID.Text;
cmd.Parameters.Add("@Pass", DbType.String).Value = txtPass.Text;
cmd.Parameters.Add("@Enabled", DbType.Int32).Value = 1;
cmd.Parameters.Add("@Permission", DbType.Int32).Value = Convert.ToInt32(ddlPermission.SelectedValue);
cmd.Parameters.Add("@Rank", DbType.Int32).Value = Convert.ToInt32(ddlRank.SelectedValue);
cmd.Parameters.Add("@FName", DbType.String).Value = txtFName.Text;
cmd.Parameters.Add("@LName", DbType.String).Value = txtLName.Text;
cmd.Parameters.Add("@Phone", DbType.String).Value = txtPhone.Text;
cmd.Parameters.Add("@Email1", DbType.String).Value = txtEmail1.Text;
cmd.Parameters.Add("@Email2", DbType.String).Value = txtEmail2.Text;

sqlConn.Open();
int rows = cmd.ExecuteNonQuery();
sqlConn.Close();

但我收到以下错误。

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_tbl_user_profile_tbl_user_login". The conflict occurred in database "My DB Location", table "dbo.tbl_user_login", column 'ID'. The statement has been terminated.



我是存储过程的新手,所以有什么建议我应该如何修复它以便我可以将数据插入到两个表中?

表架构
tbl_user_login

ID (int)
UserID (varchar10)
Pass (varchar50)
Enabled (int)
Permission (int)
Rank (int)

tbl_user_profile

ID (int)
FName (varchar50)
LName (varchar50)
Phone (varchar50)
Email1 (varchar50)
Email2 (varchar50)

最佳答案

@Richard Its "ID" which is the Auto Increment in both tables.



将自动增量( IDENTITY )用作主键很好,但将其用作外键很危险,因为您不能真正保证它们始终同步;任何回滚都可能使它们损坏(回滚不会撤消标识增量,因为这会影响其他 SPID)。此外,两个并发 INSERT 之间的任何线程竞争s 将处于危险之中。

这里正确的做法是查询 SCOPE_IDENTITY()在第一次插入之后,并在 INSERT 中使用它到第二张 table ;即在第二个表中,您告诉它值。请注意,由于 @@ERRORSCOPE_IDENTITY()是浮点值,你应该在第一个 INSERT 之后直接查询它们:
SELECT @Error = @@ERROR, @NewId = SCOPE_IDENTITY()

关于sql - 插入两个有关系的表的存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5762942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com