Sql 使用VB.NET将主键插入其他表

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)) 这两个表是相关的。一个人只能有一个投票名额。所以你可以称之为一对一的关系。我创建了两个表,因为还有一些人不是投票者,我

我使用SQL Server作为我的DBMS,我有两个表,即
Person
Voter

Person
有以下列:

  • PersonId
    int
    ,主键自动递增int\u标识)
  • FirstName
    nvarchar(50)
  • LastName
    nvarchar(50)
Voter
有以下列:

  • VoterPersonId
    int
    ,外键)
  • VoterPlace
    nvarchar(50)
这两个表是相关的。一个人只能有一个投票名额。所以你可以称之为一对一的关系。我创建了两个表,因为还有一些人不是投票者,我必须将他们包括在我的数据库中,我不想创建空值,所以我创建了一个单独的表,即“投票者”表。基本上,我想知道我们城市登记选民和非选民的人数。现在,我在VB.NET中创建了一个“保存”按钮,并使用以下代码将信息插入到我的表中:

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中使用参数的一般信息,请查找该信息,因为它不是此特定问题的一部分,例如,哇,现在我开窍了!非常感谢你的帮助。今天我学到了一些新东西。我还有很多改进的余地。我真的很尊重程序员,我希望有一天我能像你一样成为一名优秀的程序员,并教给像我这样有抱负的程序员。如果答案是你问题的最佳答案,不要忘记接受。它可以帮助其他人找到这个线索,通过搜索知道应该关注什么。经过一些研究,我发现这个答案更好。