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

时间:2014-10-15 01:38:53

标签: sql sql-server vb.net primary-key sql-insert

我使用SQL Server作为我的DBMS,我有2个表,即PersonVoter

Person包含以下列:

  • PersonIdint,主键自动增量int_identity),
  • FirstNamenvarchar(50)
  • LastNamenvarchar(50)

Voter包含以下列:

  • VoterPersonIdint,外键)
  • VoterPlacenvarchar(50)

这两个表是相关的。 1人只能有1个选民。所以你可以称之为一对一关系。我创建了2个表,因为还有一些人不是我必须包含在我的数据库中的选民而且我不想创建空值,所以我创建了一个单独的表,这是'选民&# 39;表。基本上,我想知道我们城市登记选民和非选民的人数。现在,我已经创建了一个' save' 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

现在,我的问题是我不知道如何转移“人物”的价值。主键是将in_identity自动增加到' VoterPersonId'我点击“保存”的那一刻按钮。可能吗?你能帮我解决这个问题吗?我真的很感激。

2 个答案:

答案 0 :(得分:0)

您可以在单个存储过程中执行两个查询

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)

答案 1 :(得分:0)

您可以使用存储过程,但您当然不必这样做。但原则仍然是相同的。您执行插入父表,然后使用SCOPE_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