Я пытаюсь запустить пару процедур PL / SQL из приложения VB. Процедуры занимают некоторое время, поэтому я собираюсь поместить их в отдельные темы (тема, с которой я новичок)
В настоящее время каждый поток вызывает функцию, которая в свою очередь вызывает следующий код:
' Function getDataSet
' builds a data set from given information
' Parameters:
' aCommand - the PL/SQL procedure to call
' aParamCollection - an oraParameterCollection object containing all the parameters
' aDataSet - a data set to hold the results
' Returns:
' number of rows retrieved
Public Function getDataSet( _
ByVal aCommand As String, _
ByVal aParamCollection As oraParameterCollection, _
ByRef aDataSet As DataSet _
) As Integer
Dim result As Integer = 0
' define commands etc
Dim cmd As OracleCommand = New OracleCommand(aCommand, dbConn)
cmd.CommandType = CommandType.StoredProcedure
' add parameters for the query
For i As Integer = 0 To aParamCollection.getParameterCount() - 1
cmd.Parameters.Add(New OracleParameter( _
aParamCollection.getParameterByIndex(i).ParameterName, _
aParamCollection.getParameterByIndex(i).ParameterType)).Value = _
aParamCollection.getParameterByIndex(i).ParameterValue
Next
Dim param As OracleParameter = New OracleParameter("io_cursor", OracleDbType.RefCursor)
cmd.Parameters.Add(param).Direction = ParameterDirection.Output
CheckConnection()
cmd.ExecuteNonQuery()
Dim cur As OracleRefCursor
cur = param.Value
cmd.Dispose()
Dim theAdaptr As New OracleDataAdapter
If aDataSet IsNot Nothing Then
theAdaptr.Fill(aDataSet, cur)
result = aDataSet.Tables(0).Rows.Count
End If
Return result
End Function
Где:
aCommand = процедура PL / SQL для выполнения
aParamCollection = пользовательский класс, который содержит параметры, типы и значения
aDataSet = набор данных для хранения результирующих данных
Однако, когда я запускаю приложение, в этот момент я получаю нарушение прав доступа:
theAdaptr.Fill(aDataSet, cur)
Я предполагаю, что отдельные потоки не могут одновременно вызывать Fill, это правильно? В настоящее время я запускаю каждую тему следующим образом:
Dim th_Mean As New Thread(AddressOf getMeanData)
Dim th_Stdev As New Thread(AddressOf getStdevData)
th_Mean.Name = "th_Mean"
th_Stdev.Name = "th_Stdev"
th_Mean.Start()
th_Stdev.Start()
Do While th_Mean.IsAlive Or th_Stdev.IsAlive
Loop
В конечном счете, мой вопрос в том, что должен сделать, чтобы избежать нарушения доступа?
Спасибо за чтение
BBZ