2014-06-06 65 views
0

所以我有两个表,员工和登录:添加到两个表,可以外键不添加到第二个表

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表可以正常工作,但是使用Login表时,我在Visual Studio中得到一个异常,因为EmpID'不能为null',尽管在Employee表中它也被设置为Identity。即使未设置为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(); 

任何帮助将不胜感激。

+2

如果你'Login'表引用'Employee.EmpID',那么你的' Login.EmpID' **不能**为'IDENTITY'专栏!您需要手动**为'EmpID'提供一个有效值**到与'Employee.EmpID'匹配的'Login'表。 –

+1

@marc_s是对的。更好的是,你应该选择Employee表中创建的新员工的EmpId,并在向Login表中添加详细信息时也提交此值。 – Deepshikha

回答

3

那么,首先要做的是在登录表EmpID中删除IDENTITY。
这将与其他Employee表的ID相同,因此您不希望数据库为Login表生成可能的不同ID。其次,您需要从Employee表中检索数据库自动分配的最后一个ID。
这是可以实现的附加在SELECT SCOPE_IDENTITY()第一个查询和检索分配给员工身份列调用的ExecuteScalar()的值

// 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(); 
+0

谢谢。我从Login.EmpID中删除了Identity标志。我可以通过分离添加到两个表并将EmpID从第一个传递到第二个的命令来查看你的意思。不幸的是,我现在正在接近“错误的语法”;标记ExecuteScalar语句的错误消息。 – Alycus

+0

抱歉,放错了位置的括号。并且将转换更改为转换,因为由ExecuteScalar返回的对象不能转换为整数,所以需要转换 – Steve

+0

再次感谢,现在虽然它已更改为“指定的转换无效”错误。 – Alycus