Wegschrijven naar access gaat traag wanneer database open is

Status
Niet open voor verdere reacties.

tuning4you

Gebruiker
Lid geworden
3 jun 2007
Berichten
328
Ik heb een applicatie geschreven dat data wegschrijft naar een access database.
Deze applicatie leest data uit bestanden en schrijft dit weg in een tabel wanneer het ID nog niet beschikbaar is. Er wordt een update uitgevoerd wanneer het ID wel beschikbaar is. Dit voor 3 tabellen.

Wanneer ik mijn applicatie draai kan het 3 bestanden verwerken per seconde. Wanneer de database zelf geopend staat, dan wordt er slechts 1 bestand verwerkt gedurende meerdere seconden. Deze verwerking is dus uiterst traag.

Ik heb volgende code in mijn eerste routine:

strSQL = "select specialistnr,id1 from specialisten where id1 = '" & objGegevens.SpecialistADT & "'"
objGegevens.SpecialistDB = DatabaseBewerking(objConnection, objGegevens, strSQL, 1)
objGegevens is a class where i collect my data for the database.


Volgende functie is nodig om na te gaan indien de data reeds beschikbaar is. Indien dit het geval is zal er een update mogelijks uitgevoerd worden als de optional blnUpdate true is. Indien de data niet beschikbaar is zal de data worden toegevoegd.

Private Function DatabaseBewerking(ByVal objConnection As OleDbConnection, ByVal objGegevens As Gegevens, ByVal strSQL As String, Optional ByVal intTable As Integer = 0, Optional ByVal blnUpdate As Boolean = False) As Integer
Dim objDataAdapter As New OleDbDataAdapter(strSQL, objConnection)
Dim objCommandBuilder As New OleDbCommandBuilder(objDataAdapter)

Dim objDataSet As New DataSet

objDataAdapter.Fill(objDataSet, "Table")

If objDataSet.Tables("Table").Rows.Count = 1 Then
DatabaseBewerking = objDataSet.Tables("Table").Rows(0).Item(0).ToString
If blnUpdate = True Then
Dim objDataRow As DataRow
objDataRow = objDataSet.Tables("Table").Rows(0)
DatabaseVullen(objGegevens, objDataRow, intTable)
objDataAdapter.Update(objDataSet.Tables("Table"))
End If
Else
Dim objDataRow As DataRow
objDataRow = objDataSet.Tables("Table").NewRow
DatabaseVullen(objGegevens, objDataRow, intTable)
objDataSet.Tables("Table").Rows.Add(objDataRow)
objDataAdapter.Update(objDataSet.Tables("Table"))
DatabaseBewerking = DatabaseBewerking(objConnection, objGegevens, strSQL)
End If
Return DatabaseBewerking
End Function


De laatste functie DatabaseVullen is nodig om de data toe te voegen of up te daten.

Private Sub DatabaseVullen(ByVal objGegevens As Gegevens, ByRef objDataRow As DataRow, ByRef intUpdate As Integer)

Select Case intUpdate
Case 1
objDataRow("id1") = objGegevens.SpecialistADT
End Select
End Sub



Iemand een idee hoe ik dit kan verbeteren?
 
Ik gebruik zelf meestal sql server, maar volgens mij gaat er erg veel tijd verloren in de manier hoe je controleert of een record bestaat:

Dim objDataSet As New DataSet
objDataAdapter.Fill(objDataSet, "Table")

Waarom gebruik je niet gewoon een executescaler, executenonquery of evt zelfs een executereader? En de update kun je dan gewoon met een SQL Update commando uitvoeren, ipv eerst een virtuele tabel vullen en dan weer fysiek wegschrijven.
 
Ik heb mijn code al wat aangepast. Maar het verwerken is nog steeds traag als men in de database bezig is. Dit zal dan maar normaal zijn zeker.
Onderstaande is maar een stukje van de code. In totaal moet ik voor zo'n 4 tabellen van mijn database kijken indien de gegevens er al inzitten, zoniet moeten deze toegevoegd worden.

Volgende heb ik nu:

Dim objConnection As New OleDbConnection(strConnectionString) objConnection.Open()

strSQLselect = "select specialistnr, id1 from specialisten where id1 = '" & objGegevens.HuisartsADT & "'"

objGegevens.HuisartsDB = LeesRecordUit(strSQLselect, objConnection, "Specialistnr")

If objGegevens.HuisartsDB = Nothing Then
strSQLinsert = "INSERT INTO specialisten (id1) VALUES ('" & objGegevens.HuisartsADT & "')"
VoegRecordToe(strSQLinsert, objConnection)
objGegevens.HuisartsDB = LeesRecordUit(strSQLselect, objConnection, "Specialistnr")
End If



Mijn routine LeesRecordUit maakt dus gebruik van een ExecuteReader:

Private Function LeesRecordUit(ByVal strSql As String, ByVal objConnection As OleDbConnection, ByVal strKolom As String) As Integer
Dim objCommand As New OleDbCommand(strSql, objConnection)
Dim objDataReader As OleDbDataReader = objCommand.ExecuteReader()
LeesRecordUit = Nothing

While objDataReader.Read
LeesRecordUit = CInt(objDataReader(strKolom))
End While

objDataReader.Close()

Return LeesRecordUit
End Function


Mijn routine VoegRecordToe maakt dan gewoon gebruik van een ExecureNonQuery:

Private Sub VoegRecordToe(ByVal strSql As String, ByVal objConnection As OleDbConnection)
Dim objCommand As New OleDbCommand(strSql, objConnection)
objCommand.ExecuteNonQuery()
End Sub
 
Gebruik SQL Server of MySQL ... Heb je dan geen problemen meer mee!
En komt erbij dat de performantie drastisch verhoogd wordt! :thumb:
 
Ja dat weet ik maar dat gaat niet. Het is voor gegevens in te voeren in een bestaande database die niet van mij is.
 
Access is niet onmiddellijk de beste oplossing indien er meerdere gebruikers
op eenzelfde database werken.

Ik merkte in de code dat er niet altijd een connection.close() wordt aangeroepen.
Kan dit de snelheid niet wat opdrijven? Openstaande connecties kunnen de hele
boel vertragen.
 
Na mijn laatste bewerking van de 4de tabel staat er een close (objConnection.Close()).

Van die access ga ik niet afstappen.Dit is een bestaande db waar ik geen tijd en zin voor heb om daar een applicatie voor te schrijven :-). Men gebruikt de database trouwens maar op 1 computer.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan