添加到两个表,不能添加外键到第二个表

本文关键字:添加 不能 第二个 两个 | 更新日期: 2023-09-27 18:06:55

所以我有两个表,Employee和Login:

CREATE TABLE [dbo].[Employee] (
[EmpID]          INT           IDENTITY (1, 1) NOT NULL,
[ManagerID]      INT           NULL,
[EmpName]        VARCHAR (50)  NOT NULL,
[EmpRank]        VARCHAR (50)  NOT NULL,
[EmpDateOfBirth] DATE          NOT NULL,
[EmpAddress]     VARCHAR (100) NOT NULL,
[DeptID]         INT           NOT NULL,
[EmpSalary]      INT           DEFAULT ((0)) NOT NULL,
[EmpGender]      VARCHAR (50)  NOT NULL,
PRIMARY KEY CLUSTERED ([EmpID] ASC),
CONSTRAINT [FK_Employee_Department] FOREIGN KEY ([DeptID]) REFERENCES [dbo].[Department] ([DeptID])

CREATE TABLE [dbo].[Login] (
[Username] VARCHAR (50) NOT NULL,
[Password] VARCHAR (50) NOT NULL,
[EmpID]    INT          NOT NULL IDENTITY,
PRIMARY KEY CLUSTERED ([Username] ASC),
CONSTRAINT [FK_Login_Employee] FOREIGN KEY ([EmpID]) REFERENCES [dbo].[Employee] ([EmpID])

所以我有一个页面表单来创建一个新的Employee,它将信息添加到Employee和Login表中。对于雇员表,这工作得很好,但对于登录表,我在Visual Studio中得到一个异常,因为EmpID"不能为空",即使像雇员表一样,它也被设置为身份。即使未设置为Identity,也会发生异常。所以我想知道我能做些什么,这样我就可以添加一个新的雇员,同时在两个表中为新记录保持相同的EmpID。

下面是添加新信息的c#代码:
SqlCommand sqlc = new SqlCommand("Insert into Employee(EmpName, EmpRank, EmpDateOfBirth, EmpGender, DeptID, EmpSalary, EmpAddress) values (@EmpName, @EmpRank, @EmpDateOfBirth, @EmpGender, @DeptID, @EmpSalary, @EmpAddress)", connect);
            sqlc.Parameters.AddWithValue("@EmpName", TextBoxName.Text);
            sqlc.Parameters.AddWithValue("@EmpRank", DropDownListRank.Text);
            sqlc.Parameters.AddWithValue("@EmpDateOfBirth", TextBoxDateOfBirth.Text);
            sqlc.Parameters.AddWithValue("@EmpGender", DropDownListGender.Text);
            sqlc.Parameters.AddWithValue("@DeptID", DropDownListDepartment.Text);
            sqlc.Parameters.AddWithValue("@EmpSalary", TextBoxSalary.Text);
            sqlc.Parameters.AddWithValue("@EmpAddress", TextBoxAddress.Text);
            SqlCommand sqlc2 = new SqlCommand("Insert into Login(Username, Password) values (@Username, @Password)", connect);
            sqlc2.Parameters.AddWithValue("@Username", TextBoxUsername.Text);
            sqlc2.Parameters.AddWithValue("@Password", TextBoxPassword.Text);
            connect.Open();
            sqlc.ExecuteNonQuery();
            sqlc2.ExecuteNonQuery();
            connect.Close();

添加到两个表,不能添加外键到第二个表

首先要做的是删除Login表EmpID中的IDENTITY。
这将是另一个Employee表的相同ID,因此您不希望数据库为Login表生成一个可能不同的ID。

其次,需要从Employee表中检索数据库自动分配的最后一个id。
这可以在第一次查询时附加SELECT SCOPE_IDENTITY(),并调用ExecuteScalar()

检索分配给Employee标识列的值来实现。
// Notice the semicolon at the end of the first query to separate
// the second command text. The result of this second command is returned 
// by ExecuteScalar
SqlCommand sqlc = new SqlCommand(@"Insert into Employee(EmpName, EmpRank, EmpDateOfBirth, 
                                   EmpGender, DeptID, EmpSalary, EmpAddress) 
                                   values (@EmpName, @EmpRank, @EmpDateOfBirth, 
                                   @EmpGender, @DeptID, @EmpSalary, @EmpAddress);
                                   SELECT SCOPE_IDENTITY()", connect);
sqlc.Parameters.AddWithValue("@EmpName", TextBoxName.Text);
sqlc.Parameters.AddWithValue("@EmpRank", DropDownListRank.Text);
sqlc.Parameters.AddWithValue("@EmpDateOfBirth", TextBoxDateOfBirth.Text);
sqlc.Parameters.AddWithValue("@EmpGender", DropDownListGender.Text);
sqlc.Parameters.AddWithValue("@DeptID", DropDownListDepartment.Text);
sqlc.Parameters.AddWithValue("@EmpSalary", TextBoxSalary.Text);
sqlc.Parameters.AddWithValue("@EmpAddress", TextBoxAddress.Text);
connect.Open();
int empid = Convert.ToInt32(sqlc.ExecuteScalar());
// Now pass the empid value to the second table 
// Remember to remove the IDENTITY flag from Login.EmpID otherwise
// you will get an error.
SqlCommand sqlc2 = new SqlCommand(@"Insert into Login(EmpID, Username, Password) 
                                   values (@empid, @Username, @Password)", connect);
sqlc2.Parameters.AddWithValue("@empid", empid);
sqlc2.Parameters.AddWithValue("@Username", TextBoxUsername.Text);
sqlc2.Parameters.AddWithValue("@Password", TextBoxPassword.Text);
sqlc2.ExecuteNonQuery();
connect.Close();