VBアプリケーション内からいくつかのPL/SQLプロシージャを実行しようとしています。VBスレッド内のOracleからのデータセットの入力
' 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はは
aParamCollectionを実行するPL/SQLのPROCを=パラメータ、型を保持し、値カスタムクラスを=
aDataSet =得られたデータを保持するデータセット
しかし、私はアプリを実行したとき、私はこの時点でアクセス違反を取得:
theAdaptr.Fill(aDataSet, cur)
私は別のスレッドが同時に記入する電話をかけることができないと仮定し、これは正しいでしょうか?私は現在ように、各スレッドをキックオフしています:アクセス違反が起こっを避けるために
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
返信用Thx。私が使用しているストアドprocsは、実際に私は別のスレッドで投稿したこのようなものです:http://stackoverflow.com/questions/4218345/solved-pl-sql-avg-function-with-vs2008-causing-arithmetic-operation-resulted -i DECODEでAVGを使用して、特定の名前に基づいてデータの平均を列にソートします。上記のクエリを1年以上実行すると、実行に10分以上かかります(これは、私が上で達成しようとしているものには不合理です!) – Bob
この手順を最適化するには、いくつかの方法があります。リモートデータベース?可能な限り多くの処理を同じ場所で実行できれば、分散処理は非常に複雑です。すべてのテーブルがローカルであれば、並列処理を追加するのは簡単ですが、データベースリンク全体で並列化することはできません。 Oracleのマニュアルの中には、通常、分散表が通常はローカル・インスタンスに引き込まれ、そこで結合されていることが含まれています。 DRIVING_SITEのヒントが役立つかもしれませんか? –
こんにちは、再びアドバイスのためのthx。私はこれについて図面ボードに戻って、クライアントコードで統計情報などを行うかもしれないと考えてください(私は、DBを使って仕事をすることがポイントだと思っていましたが)。私は、procsプライマリDBに入れて、私はヒントを使用していないので、それは学習曲線のように思えます(これは私が嫌うものではありませんが、このプロジェクトに重点を置くより重要なことです)。 – Bob