SqlDataReader вызывает SqlException в vb.net 2008

Проблема, с которой я сталкиваюсь, заключается в том, что я продолжаю ловить исключение SQL. Это происходит в моем классе «FlexList». Я запустил отладчик, и это строка кода «Dim mySqlDataReader As SqlDataReader = myCommand.ExecuteReader», которая ломает его и выдает ошибку. Что я делаю неправильно? предложенная помощь была бы ЧРЕЗВЫЧАЙНО полезной.

Оператор запроса, входящий в класс, сталкивается с ошибками:

Public Class MainView
    Private _thatList As New GetClass
    Private _AddEditTerms As New Add_EditWindow
    Private _listManager As New listManager
    Private myQuery As String = _thatList.getAvaliableStatuses
    Private _flexList As New FlexList(myQuery)
'cut out the rest of the code
End Class

Класс, обнаруживший ошибки: Imports System.Data.SqlClient Imports System.Collections.Specialized

Public Class FlexList
    Public ReadOnly rows As New List(Of Dictionary(Of String, String))
    Public ReadOnly fields() As String

    Public Sub New(ByRef myQuery As String)
    Dim myConnection As SqlConnection = DataConnection.getProperityDBConnection()
    Dim row As Dictionary(Of String, String)

    Try
        myConnection.Open()
        Dim myCommand As New SqlCommand()
        myCommand.Connection = myConnection
        myCommand.CommandText = myQuery
        Dim mySqlDataReader As SqlDataReader = myCommand.ExecuteReader

        If mySqlDataReader.HasRows Then
            Dim fieldCount = mySqlDataReader.FieldCount
            ReDim fields(fieldCount - 1)

            mySqlDataReader.Read()
            For i = 0 To fieldCount - 1
                fields(i) = mySqlDataReader.GetName(i)
            Next

            Do
                row = New Dictionary(Of String, String)
                For i = 0 To fieldCount - 1
                    row.Add(mySqlDataReader.GetName(i), IIf(mySqlDataReader.IsDBNull(i), "NULL", mySqlDataReader.GetValue(i).ToString))
                Next
                rows.Add(row)
                row = Nothing
            Loop While mySqlDataReader.Read()

        End If

    Catch ex As SqlException
        MsgBox("Database Error. Please contact you system administor")
    Catch ex As DataException
        MsgBox("Connection Error. Please contact The Delevelopement Team")
    Catch ex As Exception
        MsgBox("An Unknown Error has occured. Try again and report the error if it persists: " & vbCr & ex.ToString)
    Finally
        myConnection.Close()
    End Try

End Sub

End Class

Хранимая процедура, которую я использую для проверки: Imports System.Data.SqlClient

Public Class Get_Avaliable_Statuses
Public Function getAvailableStatuses()
    Dim connection As SqlConnection = DataConnection.getProperityDBConnection

    Dim insertCommand As New SqlCommand("dbo.ksp_Get_Available_Statuses", connection)
    insertCommand.CommandType = CommandType.StoredProcedure

    Try
        connection.Open()
        Dim count As Integer = insertCommand.ExecuteNonQuery()
        If count > 0 Then
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        Throw ex
    Finally
        connection.Close()
    End Try
End Function
End Class

person Gnathan    schedule 16.01.2014    source источник
comment
... В какой строке ошибка? Я вижу возможную нулевую ссылку с IIf(mySqlDataReader.IsDBNull(i), "NULL", mySqlDataReader.GetValue(i).ToString). Даже если он нулевой, он все равно будет оценивать ложную часть. изменение IIF() на просто If() исправит это.   -  person helrich    schedule 16.01.2014
comment
Вопрос на самом деле отвечает на этот вопрос: Dim mySqlDataReader As SqlDataReader = myCommand.ExecuteReader   -  person cubitouch    schedule 16.01.2014
comment
Мне не хочется об этом спрашивать, но не кажется ли вам, что фактическое исключение очень важно включить в этот вопрос?   -  person Mike Perrenoud    schedule 16.01.2014
comment
Тогда не обращайте внимания на мой предыдущий комментарий (хотя это все еще хорошее изменение), ваша проблема заключается в тексте запроса или ваших настройках подключения, ни один из которых не находится в вашем коде.   -  person helrich    schedule 16.01.2014
comment
Строка подключения работает. Я запустил его через встроенный отладчик vb, и ошибок не было. Я также протестировал хранимую процедуру, которую я использую на нашем SQL-сервере, просто чтобы убедиться, что она работает, и она работает.   -  person Gnathan    schedule 16.01.2014
comment
Добавление хранимой процедуры в код.   -  person Gnathan    schedule 16.01.2014
comment
если эта myCommand.ExecuteReader ошибка, я хочу посмотреть, что в myCommand.CommandText = myQuery   -  person T.S.    schedule 16.01.2014
comment
@Т.С. Я добавил, откуда исходит оператор запроса. Я поместил его в класс окна основного вида для целей тестирования.   -  person Gnathan    schedule 16.01.2014
comment
Есть ваша проблема - [*] используйте * . Убрать квадратные скобки   -  person T.S.    schedule 16.01.2014
comment
@Т.С. ... Конечно, это будет такая ошибка... Большое спасибо за помощь. Я думаю, что я смотрел на него слишком долго. Вы здорово сэкономили время. :D   -  person Gnathan    schedule 16.01.2014
comment
Нет проблем, мы все делаем это каждый день. пожалуйста, отметьте мой ответ. Спасибо   -  person T.S.    schedule 16.01.2014
comment
Тоже не могу, пока не наберу 15 повторений. Как только сделаю, отмечу!   -  person Gnathan    schedule 16.01.2014
comment
Класс FlexList имеет существенный недостаток, не связанный с вашим вопросом. Имея конструктор, который принимает только строку sql, вы заставляете себя писать код, который будет ужасно уязвим для атак sql-инъекций: вы практически умоляете, чтобы вас взломали.   -  person Joel Coehoorn    schedule 16.01.2014
comment
@MichaelPerrenoud Отмечено. С этого момента я начну более точно исправлять свои ошибки. Спасибо.   -  person Gnathan    schedule 16.01.2014
comment
@JoelCoehoorn Также отметил, спасибо. Все еще изучаю веревки и делаю эту программу для 1 человека внутри отдела отчетности. Она будет единственной, кто им воспользуется. Я буду помнить об этом и работать над тем, чтобы сделать мой код более безопасным. Спасибо!!!!   -  person Gnathan    schedule 16.01.2014


Ответы (1)


Есть ваша проблема - "[*]" используйте "*". Убрать квадратные скобки

person T.S.    schedule 16.01.2014