0

このような他の投稿があることは理解していますが、私にとってうまくいく投稿を見つけることができず、Imはこれとのテザーの終わりに本当に何をすべきかわかりません。

ID列と名前列を持つテーブルがいくつかあり、外部キーなどを介してリンクテーブルで接続されています。GUIを介してデータベースにデータを入力しようとしています。そのために、'regularに挿入ステートメントを使用しています。 'テーブル、次にSelectステートメントを使用して、通常のテーブルから自動生成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()

使用しているもの:VB2010SQLサーバー管理2008r2

少し混乱していることは理解していますが、何か助けていただければ幸いです。以前にこれが発生した場合は申し訳ありません。

4

3 に答える 3

2

実際にどのような問題が発生しているかは明確ではありません。新しく生成された ID を取得する方法がわからないことを前提としています。

以下は、ADO.NET を使用して新しい ID 値を取得する方法のわかりやすい例です。

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

2 つの重要な部分は次のとおりです。

SELECT CAST(scope_identity() AS int)

新しいID値を返します

DirectCast(insertCommand.ExecuteScalar, Int32)

新しい行が挿入された場合は新しい Identity 列の値を返し、失敗した場合は 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

に基づく2つのクエリでこのコードを試すことができます@ 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 に答える