首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向两个表中添加外键,无法将外键添加到第二个表中

向两个表中添加外键,无法将外键添加到第二个表中
EN

Stack Overflow用户
提问于 2014-06-06 07:10:04
回答 1查看 232关注 0票数 0

所以我有两张桌子,雇员和登录:

代码语言:javascript
复制
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])

代码语言:javascript
复制
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和Login表中。对于Employee表,这个操作很好,但是对于Login表,我在Visual中得到了一个异常,因为EmpID‘不能为空’,尽管与Employee表中的情况一样,它也被设置为Identity。即使未将异常设置为Identity,也会发生异常。因此,我想知道我能做些什么,以便在两个表中为新记录保留相同的EmpID的同时添加一个新的雇员。

添加新信息的C#代码如下所示:

代码语言:javascript
复制
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();

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-06 07:16:13

首先要做的是删除登录表EmpID中的标识。

这将是其他Employee表的相同ID,因此您不希望数据库为Login表生成可能的不同ID。

其次,您需要从Employee表中检索数据库自动分配的最后一个id。

这可以在第一个查询时追加身份(),并检索分配给调用ExecuteScalar()的雇员标识列的值。

代码语言:javascript
复制
// 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();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24076200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档