我知道还有其他这样的帖子,但是我找不到一个适合我的帖子,我真的在我的系绳的尽头,我真的不知道该怎么办。
我有一些带有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
我理解它有点混乱,但任何帮助将不胜感激,如果之前已经出现,我很抱歉。
答案 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)
...