私はExcelプロジェクトを使用して家具の価格を計算しています。最初のタスクは、データベースからすべてのマテリアルを選択することです。 これはコードです:アクセスMDBファイルを照会しながら、最近、私はいくつかの問題を思い付いたVBA:サーバー上でExcelを使用したアクセスを照会
Sub Material_search()
Dim cnt As New ADODB.connection
Dim rst As New ADODB.Recordset
Dim rcArray As Variant
Dim sSQL As String
Dim db_path As String, db_conn As String
Dim item As String
item = Replace(TextBox1.Text, " ", "%") ' Search word
sSQL = "Select Data, NomNr, Preke, Matas, Kaina, Tiek from VazPirkPrekes " & _
"Where VazPirkPrekes.PirkVazID IN (SELECT VazPirkimo.PirkVazID FROM VazPirkimo Where VazPirkimo.Sandelys like '%ALIAVOS')" & _
" and Year(VazPirkPrekes.Data)>=2011 and Preke Like '%" + item + "%' and Kaina > 0" & _
" Order by Preke, Data Desc"
db_path = Sheets("TMP").Range("B6").value
db_conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db_path & ";"
cnt.Open db_conn
rst.Open sSQL, cnt, adOpenForwardOnly, adLockReadOnly
ListBox1.Clear
If Not rst.EOF Then
rcArray = (rst.GetRows)
rcArray = WorksheetFunction.Transpose(rcArray)
Dim a As Variant
With ListBox1
.ColumnCount = 6
.list = rcArray
.ListIndex = -1
End With
End If
rst.Close: Set rst = Nothing
cnt.Close: Set cnt = Nothing
Label4.Caption = UBound(ListBox1.list) + 1
End Sub
。問題は、データベースファイルがローカルディスク上にある場合、検索は非常に高速ですが、サーバーにデータベースファイルを置くと、検索に10倍の時間がかかりますが、これは受け入れられません。
このコードの最適化はありますか?またはそれは、サーバーの問題クエリがアクセスデータベースエンジンは、両方のテーブルからすべての190K行を取り出す必要があること、事前
コードを最適化した場合であっても - それができる仮定 - - 問題はリモートクエリであることは明らかです。それはネットワークの速度、待ち時間、またはAccessがこのために設計されていないという事実のためでしょうか。アクセスを捨てて目的に合ったものに移動できない場合は、クエリをパラメトリックにしてAccessに格納することができますExcelプロジェクトから遠隔に呼び出すことができます。しかし、私はまだ違いがないと思っています:P – Xophmeister
一般的な問題は長いパスです。マップされたドライブを使用しようとしましたか? – Fionnuala
@Xophmeisterアクセスはサーバー上で正常に動作し、何年も行っています。これのために設計されています。バックエンドがサーバー上で、フロントエンドがユーザーのPC上にあるマルチユーザー環境に推奨されるMicrosoftの記事をご覧ください。 – Fionnuala