2015-07-27 5 views
0

Я создаю WinService в VB.NET, чтобы получить некоторые данные из таблицы, сделать некоторые вещи с этими данными, а затем загрузить новые данные в эту таблицу. Что мне нужно что-то вроде этого:Выполнение нескольких хранимых процедур в VB.NET

Dim conn As New MySqlConnection(my_connString) 
conn.Open() 

Dim cmd As New MySqlCommand("my_Stored_Procedure_1", conn) 
cmd.CommandType = CommandType.StoredProcedure 

Dim reader As MySqlDataReader = cmd.ExecuteReader() 

While reader.Read() 
    Try 
     ' SP to SELECT Data from DB table ' 
     Dim columnData As String 
     columnData = reader("ColumnName") 
     columnData_2 = reader("ColumnName_2") 

     ' (...) Do something with this Data ' 

     Try 
      ' SP to UPDATE Data into the same DB table ' 
      'cmd.Dispose() ' 
      cmd = New MySqlCommand("my_Stored_Procedure_2", conn) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.ExecuteReader() 

      ' (...) Do something else ' 

     Catch ex As Exception 
      Console.WriteLine("ERROR: " & ex.Message) 
     End Try 
    Catch ex As Exception 
     Console.WriteLine("ERROR: " & ex.Message) 
    End Try 
End While 

reader.Close() 
conn.Close() 

Проблема заключается в том, что это не работает. Он говорит: Уже открыт DataReader, связанный с этим соединением, который должен быть закрыт первым. Итак, я попытался создать различные команды SQL, закрыть и повторно открыть соединение и создать различные подключения, например, предложенные here, но все они без успеха. Класс This кажется полезным, но это много кода для простой (?) Задачи. Я прочитал много подобных вопросов, но пока не нашел того, что мне нужно.

Как я могу справиться с этой проблемой? Некоторая помощь будет приятной.

+0

Вы рассматривали возможность создания отдельного идентификатора для команды в цикле? И вы не назначаете читателю внутреннего командного объекта на что-либо. – Uueerdo

+0

Эти объекты БД не удаляются, как и должны быть. внешняя часть имеет открытый читатель, который вы повторяете, который ассоциируется с ** объектом команды **. Внутри цикла While вы пытаетесь использовать повторно * тот же * командный объект с хранимой процедурой, и все, что происходит в * Сделайте что-то еще *. Не пытайтесь использовать один и тот же командный объект одновременно для нескольких задач. – Plutonix

+0

Я попытался использовать 'cmd.Dispose()' или создать разные объекты команд, но я не смог заставить это работать. – mafap

ответ

1

Это похоже на дубликат the question, с которым вы связались, но ответ там не содержит подробностей о том, как исправить ошибку. Как говорится в сообщении об ошибке, у вас может быть только один открытый считыватель на одно соединение, поэтому вам нужно использовать другое соединение для обновления. Вы говорите, что попробовали это, но, возможно, ваша попытка была неправильной. Как указано в связанном вопросе, вы также должны использовать операторы Using для управления ресурсами.

Таким образом, вы, вероятно, хотите что-то вроде этого (непроверенные, конечно!):

Try 
    Using conn1 As New MySqlConnection(my_connString), 
      conn2 As New MySqlConnection(my_connString) 

     conn1.Open() 
     conn2.Open() 

     Using cmd1 As New MySqlCommand("my_Stored_Procedure_1", conn1) 
      cmd1.CommandType = CommandType.StoredProcedure 

      Using reader1 As MySqlDataReader = cmd1.ExecuteReader() 
       While reader1.Read() 
        ' SP to SELECT Data from DB table ' 
        Dim columnData As String 
        columnData = reader1("ColumnName") 
        columnData_2 = reader1("ColumnName_2") 

        ' (...) Do something with this Data ' 

        ' SP to UPDATE Data into the same DB table ' 
        Using cmd2 As New MySqlCommand("my_Stored_Procedure_2", conn2) 
         cmd2.CommandType = CommandType.StoredProcedure 
         Using reader2 As MySqlDataReader = cmd2.ExecuteReader() 
          ' (...) Do something else ' 
         End Using ' reader2 
        End Using ' cmd2 
       End While 
      End Using ' reader1 
     End Using ' cmd1 
    End Using ' conn1, conn2 
Catch ex As Exception 
    Console.WriteLine("ERROR: " & ex.Message) 
End Try 

Как вы можете видеть из уровней вложенности, есть довольно много здесь происходит с точки зрения ресурса , поэтому вы можете реорганизовать это на несколько методов. Вы также можете использовать адаптер данных для заполнения DataTable для результатов my_Stored_Procedure_1, вместо использования DataReader, а затем просто нужно одно соединение (при условии, что данные для этого не слишком велики).

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