ODBC Schnittstelle unter Windows - Geschwindigkeitsprobleme

Hallo Leute,

ich habe ein Problem, vielleicht wei mir einer einen Rat. Ich habe ein dBase Datei, die ich “nur” unter Windows updaten kann. Die ein zigste Mglichkeit die ich gefunden habe, ist die ODBC Schnittstelle. Ich habe ca 4000 Datenstze zum updaten, dafr bentigt die ODBC Schnittstelle 17 Minuten. Das ist fr meines Erachtens viel zu lange. Meine Frage an euch ist, kann das sein, liegt das an der ODBC Schnittstelle oder an meiner Programmierung. Ich habe verschiedene Datasource Parameter ausprobiert, aber es hat sich nichts gendert. Wenn ich kein Update habe, bin ich ihn 50 Sekunden fertig.

[code]Dim dbODBC As New ODBCDatabase

dbODBC.DataSource = “Driver={Microsoft dBASE Driver (*.dbf)};Dbq=Z:\Xojo\Transfer;Database=Material.dbf”

// DBF Datei
Dim sqlSeek As String
Dim sqlUpdate As String
Dim rs As RecordSet

rs = dbODBC.PrimaryKeys(“ART_NR”)

// a_DBF - Public Xojo.Core.Dictionary
// (0) - Artikelnummer (Text)
// (1) - Rabatt (False) oder Einzelpreis (True)
// (2) - V oder M
// (3) - Einheitspreis (kleinster) / Rabattsatz (hchster)
// (4) - Aktuelle Zeile in der Listbox

For i=0 To a_DBF.Ubound

If a_DBF(i).Value(1) Then //Einzelpreis
sqlSeek = “SELECT * FROM MATERIAL WHERE ART_NR = '”+a_DBF(i).Value(0)+"’"
sArtNum = a_DBF(i).Value(0)

rs = dbODBC.SQLSelect(sqlSeek)

...

If rs <> Nil Then
   
    ...
    
    sqlUpdate = "UPDATE MATERIAL SET" + _
    " EK = " + cEK.ToText + "," + _
    " LIEFERANT1 = '" + sLiefer1 + "'," + _
    " LIEFERANT2 = '" + sLiefer2 + "'," + _
    " PR_PFLEGE = {D '" + dHeute.SQLDate.ToText + "'}" + _
    " WHERE ART_NR  = '" + sArtNum + "'"
    
    dbODBC.SQLExecute(sqlUpdate)
    
 End If

Else // Rabatt
sqlSeek = “SELECT * FROM MATERIAL WHERE ART_NR LIKE '”+a_DBF(i).Value(0)+"%’"
rs = dbODBC.SQLSelect(sqlSeek)

If rs <> Nil Then
  While Not rs.EOF
      sArtNum = ConvertEncoding(rs.Field("ART_NR").StringValue, Encodings.WindowsLatin1)

      ....
      
      If a_DBF(i).Value(3) <> rs.Field("EKRABATT1").CurrencyValue Then
        
      	... 
      	 
        sqlUpdate = "UPDATE MATERIAL SET" + _
        " EK = " + cEK.ToText + "," + _
        " EKRABATT1 = " + cZahl.ToText + "," + _
        " LIEFERANT1 = '" + sLiefer1 + "'," + _
        " LIEFERANT2 = '" + sLiefer2 + "'," + _
        " PR_PFLEGE = {D '" + dHeute.SQLDate.ToText + "'}" + _
        " WHERE ART_NR = '" + sArtNum + "'"
        
        dbODBC.SQLExecute(sqlUpdate)
      
					....          
      
      End If
    End If
    rs.MoveNext
  Wend
End If

End If
Next
dbODBC.Close

Return
[/code]

Es könnte helfen, erst alle SQL-Update-Statements in einem String-Array zu sammeln und dann innerhalb einer Transaktion auszuführen. Sammeln, wenn das möglich ist – so genau hab ich mir den Code jetzt nicht angeschaut.

Probier mal eine Transaktion drumherum.
Weil aktuell hast du ja 4000 Transaktionen.

Danke für eure Antworten, aber wie stelle ich eine Transaktion her ?

Laut Microsoft ODBC Schnittstelle “ODBC-Anwendungen dürfen keine Transact-SQL-Transaktionsanweisungen, wie BEGIN TRANSACTION, COMMIT TRANSACTION oder ROLLBACK TRANSACTION, verwenden, da dies zu einem unbestimmten Verhalten des Treibers führen kann. Eine ODBC-Anwendung muss im Autocommit-Modus ausgeführt werden und darf keine Funktionen oder Anweisungen für die Verwaltung von Transaktionen verwenden oder im Manualcommit-Modus ausgeführt werden und die ODBC-Funktion SQLEndTran zum Ausführen eines Commits oder eines Rollbacks für Transaktionen verwenden.”

OK, wenn Transaktion nicht funktioniert, probier mal, mehrere Update-Statements auf einmal zu übergeben:

UPDATE MATERIAL SET ... WHERE ART_NR = 100; UPDATE MATERIAL SET ... WHERE ART_NR = 101; UPDATE MATERIAL SET ... WHERE ART_NR = 102; ...

Du musst mal testen, wieviele Statements die ODBC-Schnittstelle in einem Rutsch verträgt.

Guckst Du hier:
Ausführen von Transaktionen in ODBC

normal fngt es mit einem SQLExecute mit “BEGIN” oder so an.
Spter dann das Commit.