vb.net просматривает результаты запроса - PullRequest
2 голосов
/ 27 февраля 2009

Я знаком с VB6 ADO, который обрабатывает запросы SQL и просматривает результаты набора записей.

Однако, как правильно запросить сервер, просмотреть результаты и удалить мой запрос в 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

1 Ответ

7 голосов
/ 28 февраля 2009

Я подозреваю, что проблема связана с тем, как вы управляете вашим gconIntegration соединением. Вы слишком стараетесь продолжать использовать это же соединение. Было бы полезно увидеть, где он живет.

Лучше получить "новые" соединения из пула и позволить .Net беспокоиться об этом за вас.

Кроме того, в вашем общем коде «GetSQLTable» отсутствует важная часть: он не учитывает установку параметров, что говорит мне о том, что вы встраиваете их непосредственно в строки запроса. Это путь к катастрофе: это приведет к дырам в безопасности впрыска Sql.

Еще одна вещь: не устанавливайте объекты на Nothing в .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 Data и Sql Code никогда не смешиваются.
  • Вам нужна отдельная функция для каждого запроса, который нужно отправить. Это действительно хорошая вещь, поскольку она приводит к созданию строго типизированного интерфейса для вашей базы данных. В идеале все эти функции находятся в одном классе, а функция GetConnectionString является закрытой для этого класса. За пределами этого уровня данных доступ к базе данных не происходит.
...