вызывающий саб несколько раз из одного потока - PullRequest
0 голосов
/ 29 октября 2019

У меня есть однопоточное приложение, которое должно вызывать саб несколько раз, передавая каждый раз разные аргументы. Единственная проблема заключается в том, что подпрограмма открывает читатель данных и читает данные из базы данных (используя переданный аргумент). Это работает нормально, но операция чтения занимает несколько секунд, поэтому при втором вызове подпрограммы выдается ошибка «с этим соединением уже есть открытый считыватель данных».

Не перепроектировав все мое приложение, я что-то упускаю, когда мне нужно что-то сделать с устройством чтения данных, чтобы несколько одновременных чтений происходили?

Спасибо.

Например:

For x as integer = 0 to 10
 dim id as integer = my_sub(x)
Next X

Private function my_sub(x)

  dim return_value as integer = 0

  my_reader = sqldatareader
  db.cmd.CommandText = "select id from database where id = " & x
  my_reader = db.cmd.ExecuteReader
  my_reader.Read()
  If my_reader.HasRows Then
     return_value = my_reader(0)
  End If
  my_reader.Close()

  Return return_value

End Sub

1 Ответ

2 голосов
/ 29 октября 2019

Пользователь Жесткий код предоставил отличное объяснение в их комментарии :

Ваша команда и, вероятно, ваше Соединение не относятся к области my_sub(),Вы должны создавать экземпляры объектов подключения и команд по мере необходимости, а затем избавляться от них. Ваш уже создан (и соединение открыто), обернуто в переменную db. Это то, что вызывает проблему.

И соответствующий код будет выглядеть примерно так:

Private Function MySub(x As Integer) As Integer

    Dim returnValue As Integer = 0

    Using conn As New SqlConnection(yourConnectionString)
        Dim sql = "SELECT [id] FROM [database] WHERE [id] = @x"

        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@x", .SqlDbType = SqlDbType.Int, .Value = x})

            conn.Open()
            Dim rdr = cmd.ExecuteReader()

            If rdr.HasRows Then
                rdr.Read()
                returnValue = rdr.GetInt32(0)
            End If

            rdr.Close()
            conn.Close()

        End Using
    End Using

    Return returnValue

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...