VB.NET - "Нет позиции в позиции 0", но записи в базе данных - PullRequest
1 голос
/ 22 ноября 2011

Возникла проблема с набором данных в VB.NET/Access. Код должен вернуть 1 запись и отобразить результаты в форме.

В основном, когда я выполняю код в режиме отладки, он возвращает 1 строку и работает нормально, но когда я запускаю код без точек останова, я получаю сообщение об ошибке:

В позиции 0

нет строки

VB.NET 2010 и MS Access 97

Dim sConnectionString As String = "dsn=MyDatabase"
Dim sSQL As String = ""
Dim DBConnection As New OdbcConnection(sConnectionString)

Dim dsMaster As New DataSet
Dim daMaster As New OdbcDataAdapter
Dim dtMaster As New DataTable

Try   
    DBConnection.Open()

    sSQL = "SELECT * FROM myTable"
    daMaster.SelectCommand = New OdbcCommand(sSQL, DBConnection)
    daMaster.Fill(dsMaster, "MasterDataSet")

    If dsMaster.Tables(0).Rows.Count <> 0 Then
       dtMaster = dsMaster.Tables(0)

       sItem1 = dtMaster.Rows(0).Item(0).ToString
       sItem2 = dtMaster.Rows(0).Item(1).ToString
       sItem3 = dtMaster.Rows(0).Item(2).ToString
    Else
       MessageBox.Show("No Records Available", "Error", MessageBoxButtons.OK)
    End If
  • Когда я запускаю код, я получаю сообщение: 1013 * Нет записей .
  • Когда я работаю в режиме отладки с точкой останова в операторе IF , я получаю окно сообщения с надписью Нет записей .
  • Когда я работаю в режиме отладки с точкой останова в операторе FILL , я получаю 1 возвращенную запись и выполняется код в операторе IF .

Есть идеи?

1 Ответ

1 голос
/ 07 декабря 2011

Вот как бы я это сделал:

Dim sConnectionString As String = "dsn=MyDatabase"
Dim sSQL As String = ""
Dim DBConnection As New OdbcConnection(sConnectionString)

Dim dsMaster As New DataSet
Dim daMaster As New OdbcDataAdapter
Dim dtMaster As New DataTable

Try

    DBConnection.Open()

    sSQL = "SELECT * FROM myTable"
    daMaster.SelectCommand = New OdbcCommand(sSQL, DBConnection)
    daMaster.Fill(dsMaster)

    If dsMaster.Tables(0).Rows.Count <> 0 Then
        dtMaster = dsMaster.Tables(0)

        sItem1 = dtMaster.Rows(0).Item(0).ToString
        sItem2 = dtMaster.Rows(0).Item(1).ToString
        sItem3 = dtMaster.Rows(0).Item(2).ToString
    Else
        MessageBox.Show("No Records Available", "Error", MessageBoxButtons.OK)
    End If

Я удалил значение параметра "MasterDataSet" из daMaster.Fill(), потому что при его добавлении dsMaster.Tables(0) останется пустым и все ваши данные запроса будут помещены в dsMaster.Tables("MasterDataSet").

Похоже, это наиболее вероятно, откуда ваша ошибка.
Также вам не нужно dtMaster, потому что данные уже находятся в DataTable (dsMaster.Tables (0)), когда вы его заполняете.

Так что вы бы просто ссылались на эти столбцы одинаково:

sItem1 = dsMaster.Tables(0).Rows(0)(0).ToString

Имейте в виду, что предоставление имен столбцов облегчает чтение кода. Так что если у вас есть следующий запрос:

Dim sSQL As String = "SELECT Username, UserMail FROM Users WHERE UserID = 3"

Получение этих данных будет выглядеть так:

sItem1 = dsMaster.Tables(0).Rows(0)("Username")

Вам специально не нужно добавлять туда .ToString, но если вы не получили ожидаемых данных, скорее добавьте их.

...