DataTable Row suchen und updaten

18/06/2010 - 12:54 von Samy_E | Report spam
Hallo,

ich versuche meine Anwendung zu optimieren und haenge gerade an einem
Problem fest.

Folgendes
-ich lade 4 DataTables aus einer SQl Datenbank
-importiere neue Daten aus einer Excel (falls Daten bereits vorhanden
Update ansonsten Insert)

Insert ist kein Problem ich importiere eine Zeile mit ca 20 Daten und
gebe Sie per Insert an die Datenbank weiter

Beim Updaten allerdings pruefe ich aktuell mit einer Schleife ob die
Kommission bereits in der Datenbank enthalten ist überschreibe die
Lokale DataTable und aktualisiere diese dann via dataadapter.

Nun ist aber eine schleife Suboptimal? Gibt es keine andere Möglichkeit
die Row ausfindig zu machen und Items zu ueberschreiben?

txtKommission ist in der DB Unique also hab ich mit einem DataView
rowfilter gesetzt aber ich kann ja ueber View kein Item schreiben da
Readonly:

modDatabase.dataView995.RowFilter = "txtKommission = '" &
arrData(2) & "'"

If Not modDatabase.dataView995.Count = 0 Then

If modDatabase.dataView995.Count > 1 Then
frmMain.lstStatus.Items.Add("[Excel Import
995] " & arrData(2) & " mehrfach vorhanden! Count: " &
modDatabase.dataView995.Count)
frmMain.lstStatus.SelectedIndex =
frmMain.lstStatus.Items.Count - 1
End If

boolUpdate = True
'textBearbeiter (4) updaten
intSchritt = 44
If Not arrData(4) = "" Then
modDatabase.datTable995.Rows(i).Item(4) = arrData(4)
'intMeter (5) updaten
intSchritt = 55
If Not arrData(5) = 0 Then
modDatabase.datTable995.Rows(i).Item(5) = arrData(5)
'dateSapTermin (21)
intSchritt = 2121
If Not arrData(21) = CDate("01.01.2020") Then
modDatabase.datTable995.Rows(i).Item(21) = arrData(21)


Wie bekomme ich am guenstigsten i als Integer raus um die korrekte row
anzusprechen? Vorher hab ich per schleife alle rows geprueft, aber
Performanztechnisch ist das nicht das optimalste?

Ich hoffe ich hab mein Problem einigermassen vermitteln koennen.
 

Lesen sie die antworten

#1 Armin Zingler
18/06/2010 - 14:57 | Warnen spam
Am 18.06.2010 12:54, schrieb Samy_E:
Hallo,

ich versuche meine Anwendung zu optimieren und haenge gerade an einem
Problem fest.

Folgendes
-ich lade 4 DataTables aus einer SQl Datenbank
-importiere neue Daten aus einer Excel (falls Daten bereits vorhanden
Update ansonsten Insert)

Insert ist kein Problem ich importiere eine Zeile mit ca 20 Daten und
gebe Sie per Insert an die Datenbank weiter

Beim Updaten allerdings pruefe ich aktuell mit einer Schleife ob die
Kommission bereits in der Datenbank enthalten ist überschreibe die
Lokale DataTable und aktualisiere diese dann via dataadapter.



Ich hab das Prinzip nicht ganz verstanden: Inserts werden sofort an
die Datenbank weitergegeben, Updates aber erst zum Schluß? Warum
nicht die DataTable aktualisieren und dann nach dem Import die Datenbank
per Dataadapter aktualisieren?

Nun ist aber eine schleife Suboptimal? Gibt es keine andere Möglichkeit
die Row ausfindig zu machen und Items zu ueberschreiben?

txtKommission ist in der DB Unique also hab ich mit einem DataView
rowfilter gesetzt aber ich kann ja ueber View kein Item schreiben da
Readonly:



Wieso? Du kannst doch einfach mit dataView995(0).Row auf die gefundene Row
zugreifen und sie aktualisieren.

modDatabase.dataView995.RowFilter = "txtKommission = '" &
arrData(2) & "'"



Falls modDatabase ein Modul ist, dann kannst du dir den Modulnamen sparen.

If Not modDatabase.dataView995.Count = 0 Then

If modDatabase.dataView995.Count > 1 Then
frmMain.lstStatus.Items.Add("[Excel Import
995] " & arrData(2) & " mehrfach vorhanden! Count: " &
modDatabase.dataView995.Count)
frmMain.lstStatus.SelectedIndex =
frmMain.lstStatus.Items.Count - 1



Nur am Rande: SelectedIndex würde ich _nach_ der Verarbeitung setzen.
Wenn es heißt "Anwendung reagiert nicht", dann wird die Liste (visuell)
ohnehin nicht mehr aktualisiert.

End If

boolUpdate = True
'textBearbeiter (4) updaten
intSchritt = 44
If Not arrData(4) = "" Then
modDatabase.datTable995.Rows(i).Item(4) = arrData(4)

'intMeter (5) updaten
intSchritt = 55
If Not arrData(5) = 0 Then
modDatabase.datTable995.Rows(i).Item(5) = arrData(5)




Du hast vergessen, Option Strict einzuschalten. Es sei denn, dir
sind Datentypen egal. Aber dann sollte man nicht programmieren.


'dateSapTermin (21)
intSchritt = 2121
If Not arrData(21) = CDate("01.01.2020") Then
modDatabase.datTable995.Rows(i).Item(21) = arrData(21)



Es gibt Datumsliterale: #1/1/2020# Erspart die jedesmalige Konvertierung
und schließt Konvertierungsfehler aufgrund unpassender Datumsformateinstellungen
aus.

Wie bekomme ich am guenstigsten i als Integer raus um die korrekte row
anzusprechen? Vorher hab ich per schleife alle rows geprueft, aber
Performanztechnisch ist das nicht das optimalste?



Um eine Suche kommt auch die DataView und auch die DataTable.Select-Methode,
falls du die alternativ verwenden möchtest, nicht herum. Sollte txtKommission
der PK sein, ginge DataTable.Rows.Find am schnellsten, aber das scheint
aufgrund der Abfrage (modDatabase.dataView995.Count > 1) nicht so zu sein.
Allerdings frage ich mich auch, was du denn machst, wenn mehr als 1 Satz
mit gleicher txtKommission gefunden wird, denn das Feld wird wohl auch
in der Datenbank eindeutig sein. In der DataTable nicht auch (UniqueConstaint)?



Armin

Ähnliche fragen