2013-05-29 2 views
0

У меня есть функция, единственная цель которой - получить некоторые данные при нажатии кнопки и вызывать ее несколько раз. Это код функции:Неверная попытка прочитать, когда данных нет.

Function GetData2(ByVal clientNo As Integer) As List(Of SocioInfo) 


    Dim theResults2 = New List(Of SocioInfo) 
    Dim connStr = "Data Source=localhost;Initial Catalog=testdb;Integrated Security=True;MultipleActiveResultSets=true" 


    Using conn = New SqlConnection(connStr) 

     Dim sql = "SELECT [FirstName], [LastName] FROM [CustInfo] Where ([NumCuenta] = @SocioNum)" 
     Dim sql2 = "SELECT [AcctName], [AcctNum], [NewAcct], [Balance] From [ACCT_NEW] Where ([AcctNum] = @SocioNum)" 
     Dim sqlCmd = New SqlCommand(sql, conn) 
     Dim sqlCmd2 = New SqlCommand(sql2, conn) 
     sqlCmd.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text)) 
     sqlCmd2.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text)) 



     conn.Open() 

     Dim rdr = sqlCmd.ExecuteReader 
     Dim rdr2 = sqlCmd2.ExecuteReader 

     While rdr.Read 
      theResults2.Add(New SocioInfo With { 
          .Nombre = rdr.GetString(0), 
          .LastName = rdr.GetString(1) 
}) 

     End While 
     While rdr2.Read 
      theResults2.Add(New SocioInfo With { 
             .CuentaName = rdr.GetString(0), 
              .AcctNum = rdr.GetValue(1), 
              .AcctFull = rdr2.GetValue(2), 
             .Balance = rdr2.GetValue(3) 
         }) 


     End While 

    End Using 

    Return theResults2 

End Function 

Я не 100% уверен, что это лучший способ сделать это (в основном необходимо получить данные из двух разных таблиц). Дело в том, что Rdr не показывает мне никакой ошибки, Rdr2 просто ударяет по лицу. Исключение заключается в следующем:

Invalid attempt to read when no data is present. 

ответ

2

Во втором цикле вы пытаетесь использовать первый SqlDataReader, но это не представляется возможным, потому что первый цикл уже достиг конца входных данных.

Если вам нужны объединенные данные между двумя таблицами, лучшим подходом является использование только одного запроса с использованием оператора JOIN. Этот запрос работает при условии, что каждый клиент в таблице CustInfo имеет одну учетную запись в таблице ACCT_NEW

Dim sql = "SELECT c.FirstName, c.LastName, a.AcctName, a.AcctNum, a.NewAcct, a.Balance " & _ 
      "FROM CustInfo c INNER JOIN ACCT_NEW a ON a.AcctNum = c.NumCuenta " & _ 
      "WHERE NumCuenta = @SocioNum " 


Using conn = New SqlConnection(connStr) 

    Dim sqlCmd = New SqlCommand(sql, conn) 
    sqlCmd.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text)) 
    conn.Open() 
    Dim rdr = sqlCmd.ExecuteReader 

    While rdr.Read 
     theResults2.Add(New SocioInfo 
     With { 
         .Nombre = rdr.GetString(0), 
         .LastName = rdr.GetString(1) 
         .CuentaName = rdr.GetString(2), 
         .AcctNum = rdr.GetValue(3), 
         .AcctFull = rdr.GetValue(4), 
         .Balance = rdr.GetValue(5) 

     }) 
    End While 

Конец Использование

+0

* Facepalm * Я только что видел его. Такая простая проблема ... Я клянусь богом, я посмотрел на нее, как 5 раз, до публикации. Geesh. У меня теперь есть смешная проблема ... Я нажимаю кнопку «Поиск», но программа просто любопытная. Исключено исключение VB. –

+0

Я так опасаюсь SQL; Я боюсь этого ха-ха. Вот почему я не пошел с Inner Join. Ваш ответ совершенный Стив, спасибо миллион. –

Смежные вопросы