在VB中选择Statement SQL

时间:2012-09-07 14:29:49

标签: sql vb.net select

我知道还有其他这样的帖子,但是我找不到一个适合我的帖子,我真的在我的系绳的尽头,我真的不知道该怎么办。

我有一些带有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 server management 2008 r2

我理解它有点混乱,但任何帮助将不胜感激,如果之前已经出现,我很抱歉。

3 个答案:

答案 0 :(得分:1)

我真的不清楚你实际上有什么问题,我认为你不知道如何检索新生成的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)
如果插入了新行,

将返回新的Identity列值,失败时返回0。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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) 

...