0

我知道还有其他诸如此类的帖子,但是我找不到适合我的帖子,而且我真的对此束手无策,我真的不知道该怎么办。

我有一些带有 ID 列和名称列的表,它们通过链接表通过外键等连接。我正在尝试通过 GUI 将数据输入到数据库中,为此我在“常规”中使用插入语句' 表,然后选择语句从常规表中获取自动生成 ID,然后插入到链接表中。

下面的代码是我一直在尝试使用的代码。

Imports System.Data.SqlClient
    Public Class Test

Private cs As New SqlConnection(".....")

Private Sub btnInsertNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsertNext.Click
        Dim ContID As Integer
        Dim FName As Integer


        cs.Open()

Using command As New SqlCommand("Select FamID From Family Where Name = '" & FName & " '", cs)
            command.Parameters.AddWithValue("@FamID", ContID)
            command.ExecuteNonQuery()
        End Using

  Using command As New SqlCommand("Select DocID From Doctors Where DocName LIKE'" & AddFam.Doctor & " '", cs)
            command.Parameters.AddWithValue("@DocID", AddFam.Doctor) ''AddFam is another form I'm using to add a family member to a Doctor
            command.ExecuteNonQuery()
        End Using

cs.close()

我正在使用:VB 2010 SQL 服务器管理 2008 r2

我理解它有点混乱,但任何帮助将不胜感激,如果以前出现过这种情况,我很抱歉。

4

3 回答 3

2

目前尚不清楚您实际上遇到了什么问题,我假设您不知道如何检索新生成的 ID。

下面是一个关于如何使用 ADO.NET 检索新标识值的不言自明的示例:

Using con = New SqlConnection(connectionString)
    Dim newID As Int32
    Using insertCommand = New SqlCommand("INSERT INTO Test(Value)VALUES(@Value);SELECT CAST(scope_identity() AS int)", con)
        insertCommand.Parameters.AddWithValue("@Value", "Value1")
        con.Open()
        newID = DirectCast(insertCommand.ExecuteScalar, Int32)
    End Using

    If newID <> 0 Then
        Using updateCommand = New SqlCommand("UPDATE TEST SET Value='Value1.1' WHERE idTest=@idTest", con)
            updateCommand.Parameters.AddWithValue("@idTest", newID)
            If con.State <> ConnectionState.Open Then con.Open()
            Dim updatedRecordCount = updateCommand.ExecuteNonQuery
        End Using
    End If
End Using

两个重要的部分是:

SELECT CAST(scope_identity() AS int)

这将返回新的身份值

DirectCast(insertCommand.ExecuteScalar, Int32)

如果插入了新行,它将返回新的标识列值,失败时返回 0。

由于您将使用参数与字符串连接混合使用:使用参数非常重要,因为它会阻止SQL-Injection

于 2012-09-07T14:37:51.733 回答
0

不!像这样参数化您的查询。

   command = New SqlCommand("Select FamID From Family Where Name = @Fname", cs) 
   command.Parameters.AddWithValue("@Fname", ContID) 
   FamID = command.ExecuteScalar()

理想情况下,您应该使用Scope_Identity()从插入语句中获取身份

于 2012-09-07T14:37:23.817 回答
0

您可以根据以下两个查询尝试使用此代码@ symbol

...
Using command As New SqlCommand("Select FamID From Family Where Name = @FamID", cs)
command.Parameters.AddWithValue("@FamID", ContID)

...

Using command As New SqlCommand("Select DocID From Doctors Where DocName LIKE @DocID", cs)
command.Parameters.AddWithValue("@DocID", AddFam.Doctor) 

...
于 2012-09-07T14:41:16.463 回答