2

私は、SQL クエリを処理し、レコード セットの結果をループする VB6 ADO の方法に精通しています。

しかし、サーバーにクエリを実行し、結果を循環させ、VB.Net でクエリを破棄する正しい方法は何ですか? 私が使用してきたすべての方法は不安定で、ランダムにクラッシュするようです。

私は次のコードを使用しています:

Public Function GetSQLTable(ByVal strSQL As String) As DataTable
    Dim table As New DataTable
    Dim adapt As SqlDataAdapter

    Try
        adapt = New SqlDataAdapter(strSQL, gconIntegration)
        adapt.Fill(table)
    Catch ex As Exception
        LogError("GetSQLTable: " & ex.ToString(), "SQL: " & strSQL)
    End Try

    Return table
End Function

そして、次のように使用します。

 Dim dt As DataTable
 Dim lngRow As Long
 Dim current As DataRow
 Dim lngContact As long

 Try
        dt = GetSQLTable(strSQL)
        For lngRow = 0 To dt.Rows.Count - 1
            current = dt.Rows.Item(lngRow)
            lngContact = current.Item("indvid") 
            DoSomething(lngContact)
        Next
Catch ex As Exception
    LogError("FindContact: " & ex.ToString(), "SQL: " & strSQL)
    lngContact = -1     
 Finally
    current = nothing
    dt = nothing
4

1 に答える 1

7

問題は、接続の管理方法に関係していると思われますgconIntegration。同じ接続を使い続けるのに一生懸命努力しています。それがどこにあるかを確認することは役に立ちます。

プールから「新しい」接続を取得し、.Netにそれを心配させる方がよいでしょう。

また、一般的な「GetSQLTable」コードには重要な部分がありません。パラメーターを設定することはできません。これにより、パラメーターをクエリ文字列に直接構築していることがわかります。これは災害のレシピです。SQLインジェクションのセキュリティホールにつながります。

Nothingもう1つ、.Netでオブジェクトをに設定しないでください。必要に応じて廃棄するか、自分でスコープから外してください。

データテーブルからデータテーブルをプルバックするための通常の方法は次のとおりです。

Function GetSomeData(ByVal Table2ID As Integer)
    Dim result As New DataTable

    Dim sql As String = "SELECT Column1,Column2 FROM [Table1] WHERE Table2ID= @Table2ID"

    Using cn As New SqlConnection( GetConnectionString() ), _
    Using cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@Table2ID", SqlDbType.Int).Value = Table2ID

        Using rdr As SqlDataReader = cmd.ExecuteReader()
           result.Load(rdr)
        End Using
    End Using
    return result
End Function

そのコードに関するいくつかの注意:

  • ステートメントはUsing、関連するオブジェクトが対応するに配置されることを保証しますEnd Using
  • クエリパラメータは厳密に型指定されたままであり、サーバーに送信された場合でも、クエリ文字列に直接置き換えられることはありません。SQLデータとSQLコードが混在することはありません。
  • 送信する必要のあるクエリごとに個別の関数が必要です。これは、データベースの強い型のインターフェイスを構築することにつながるため、本当に良いことです。理想的には、これらの関数はすべて同じクラスにあり、GetConnectionString関数はそのクラス専用です。このデータレイヤーの外部ではデータベースアクセスは発生しません。
于 2009-02-27T21:01:57.703 に答える