Sql 使用VB.NET将主键插入其他表
我使用SQL Server作为我的DBMS,我有两个表,即Sql 使用VB.NET将主键插入其他表,sql,sql-server,vb.net,primary-key,sql-insert,Sql,Sql Server,Vb.net,Primary Key,Sql Insert,我使用SQL Server作为我的DBMS,我有两个表,即Person和Voter Person有以下列: PersonId(int,主键自动递增int\u标识) FirstName(nvarchar(50)) LastName(nvarchar(50)) Voter有以下列: VoterPersonId(int,外键) VoterPlace(nvarchar(50)) 这两个表是相关的。一个人只能有一个投票名额。所以你可以称之为一对一的关系。我创建了两个表,因为还有一些人不是投票者,我
Person
和Voter
Person
有以下列:
(PersonId
,主键自动递增int\u标识)int
(FirstName
)nvarchar(50)
(LastName
)nvarchar(50)
Voter
有以下列:
(VoterPersonId
,外键)int
(VoterPlace
)nvarchar(50)
Dim sql As New SQLControl
Private Sub cmdSave_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click
sql.con.Open()
Using cmdPerson As New SqlClient.SqlCommand("INSERT INTO Person(FirstName, LastName) VALUES('" & txtFirstName.Text & "', '" & txtLastName.Text & "')", sql.con)
cmdPerson.ExecuteNonQuery()
End Using
Using cmdVoter As New SqlClient.SqlCommand("INSERT INTO Voter(VoterPlace) VALUES('" & txtVoterPlace.Text & "')", sql.con)
cmdVoter.ExecuteNonQuery()
End Using
sql.con.Close()
End Sub
现在,我的问题是,我不知道如何在单击“保存”按钮时将“PersonId”主键的值转换为“VoterPersonId”,该主键在_identity中自动递增。可能吗?在这件事上你能帮我吗?非常感谢。您可以在一个存储过程中执行这两个查询
CREATE PROCEDURE InsertPerson
@firstname varchar(50),
@lastname varchar(50),
@voterPlace varchar(50)
AS
declare @newid int
INSERT INTO Person(Firstname, Lastname) VALUES (@firstname, @lastname)
SELECT @newid = SCOPE_IDENTITY()
INSERT INTO Voter(VoterPersonId, VoterPlace) VALUES ( @newid, @voterPlace)
您可以使用存储过程,但当然不必这样做。但原则仍然是一样的。您执行对父表的插入,然后使用
SCOPE\u IDENTITY
函数获取自动生成的ID。然后您将使用输出参数将该值返回到应用程序中,以便您可以在下一次对子表的插入中包含该值,例如
Using connection As New SqlConnection("connection string here"),
parentCommand As New SqlCommand("INSERT INTO Parent (ParentName) VALUES (@ParentName); SET @ParentId = SCOPE_IDENTITY();", connection),
childCommand As New SqlCommand("INSERT INTO Child (ParentId, ChildName) VALUES (@ParentId, @ChildName)", connection)
With parentCommand.Parameters
.AddWithValue("@ParentName", parentName)
.Add("@ParentId", SqlDbType.Int).Direction = ParameterDirection.Output
End With
connection.Open()
Dim transaction = connection.BeginTransaction()
Try
parentCommand.ExecuteNonQuery()
With childCommand.Parameters
.AddWithValue("@ParentId", parentCommand.Parameters("@ParentId").Value)
.AddWithValue("@ChildName", childName)
End With
childCommand.ExecuteNonQuery()
transaction.Commit()
Catch
transaction.Rollback()
End Try
End Using
这只是演示原理的示例代码。与所有示例一样,使用的名称不一定与您在特定情况下使用的名称相同。看看原则。将记录插入父表,通过
SCOPE\u IDENTITY
和输出参数检索自动生成的ID,然后在将记录插入子表时使用该值。表和列的实际名称以及使用的值完全取决于您的项目。至于如何使用参数,这里与任何其他ADO.NET代码完全相同。如果您想了解有关在ADO.NET中使用参数的一般信息,请查找该信息,因为它不是此特定问题的一部分,例如,哇,现在我开窍了!非常感谢你的帮助。今天我学到了一些新东西。我还有很多改进的余地。我真的很尊重程序员,我希望有一天我能像你一样成为一名优秀的程序员,并教给像我这样有抱负的程序员。如果答案是你问题的最佳答案,不要忘记接受。它可以帮助其他人找到这个线索,通过搜索知道应该关注什么。经过一些研究,我发现这个答案更好。