0

私はこのコードを持っています。insert ステートメントの ID を取得し、変数に格納したいと考えています。SqlDataSource を使用できないため、DataTableReader しか使用できず、DataTableReader での SCOPE_IDENTITY の処理に慣れていません...

Dim sql As String = "insert into tbl_url (url) values ('" & Request.RawUrl & "')"
    'Helper is a class of mine, don't mind it
    Helper.execQuery(sql)
    sql = "select SCOPE_IDENTITY() as id"
    Dim dtr As Data.DataTableReader
    dtr = Helper.getDataTableReader(sql)
    Dim code As Decimal
    If dtr.Read Then
        code = dtr("id")
    End If
    dtr.Close()

dtr("id") は DBNull です...なぜですか?

編集:

Damien_The_Unbeliever が言ったように、ヘルパーでは接続が閉じられるため、これらは 2 つの異なるスコープです...

DataTableReader のみで SCOPE_IDENTITY を変数に格納する方法を知っている人はいますか?

4

1 に答える 1

1

コメントで既に特定したように、ヘルパーは 2 つのクエリ間の接続を閉じているため、各クエリは独自のスコープで実行されます。SCOPE_IDENTITYこれががあなたの ID を見つけられない理由です。

いくつかのオプションがあります。

@@IDENTITY- これは、現在のセッションで任意のテーブルに挿入された最後の ID を返します。ただし、これには同じ問題がある可能性があります。

IDENT_CURRENT- これは、任意のセッションにわたって、指定されたテーブルに挿入された最後の ID を返します。ただし、これは必ずしもあなたのID ではありません (別の人が別の挿入を行っている可能性があります。

ただし、どちらにも問題があります。クエリから直接 ID を返す方がよい場合があります。関連する注意事項として、データを SQL 文字列に連結しないでください。これにより、SQL インジェクション攻撃が可能になります。代わりに、Sql パラメータを使用する必要があります。

以下は、大まかに行う必要がある例です。明らかに、私はこれをまっすぐな ADO.Net としてコーディングしました。これがヘルパー クラスにどのように適合するかを理解する必要があります。

Dim sql As String = "insert into tbl_url (url) values (@url); Select @ID = SCOPE_IDENTITY()"
Dim id As String = String.Empty

Dim sqlcmd As New SqlClient.SqlCommand()
sqlcmd.Connection = New SqlClient.SqlConnection("Your Connection String here")
sqlcmd.Connection.Open()
sqlcmd.CommandText = sql
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("url", Request.RawUrl))


Dim idParam = New SqlClient.SqlParameter("ID", id)
idParam.Direction = ParameterDirection.Output
sqlcmd.Parameters.Add(idParam)

sqlcmd.ExecuteNonQuery()

'Get the Value from the output parameter
id = idParam.Value
于 2014-05-22T12:35:51.533 に答える