Erstellen eines eigenen UPDATE-Statements

05/01/2009 - 21:57 von Michael Günther | Report spam
Hallo, Newsgroup!

Für eine Anwendung benötige ich einen Update-Command, der nur die Spalten
aktualisiert, die wirklich geàndert wurden.

Dazu durchlaufe ich die DataTable mit den geànderten Daten mit

foreach (DataRow row in dt.Rows)
{
if (row.RowState == DataRowState.Modified)
{

Innerhalb dieser Konstruktion prüfe ich dann mit

for (int i = 0; i < row.Table.Columns.Count; i++)
{
if (row[i, DataRowVersion.Current] == row[i, DataRowVersion.Original])
{

ob sich der Inhalt einer Spalte geàndert hat. Falls ja, möchte ich einen
SQLUpdate-String, den ich zuvor korrekt mit "UPDATE [Tabelle] SET " angelegt
habe um die jeweilige Spalte erweitern.

Dabei stosse ich nun auf zwei Probleme:

1. das korrekte Abfangen von DBNull und
2. die Umwandlung eines Datums in den SQL-String.

Mir ist auch aufgefallen, dass mir bei dieser Vorgehensweise die Typisierung
überhaupt nichts nutzt.

Natürlich würde ich viel lieber mit parametrisierten Abfragen arbeiten. Aber
auch dort komme ich nicht weiter.

Bei der Erstellung der Parameter ist jeweils die Angabe des Datentyps
erforderlich (z.B. OleDbType, SqlDbType). In der Tabelle steht aber, ganz
gleich ob typisiert oder untypisiert, immer nur der .NET-Typ.

Was kann ich tun und gibt es vielleicht noch eine elegantere Lösung?

Viele Grüsse,
Michael Günther
 

Lesen sie die antworten

#1 Peter Fleischer
06/01/2009 - 03:12 | Warnen spam
"Michael Günther" schrieb im
Newsbeitrag news:
...
Dabei stosse ich nun auf zwei Probleme:

1. das korrekte Abfangen von DBNull und



Hi Michael,
wenn du mit Parameter-Objekten arbeitest, hat ein DBNull nur Bedeutung, wenn
in der Where-Klausel auch auf Konkurrenzbedingung zu prüfen ist.

2. die Umwandlung eines Datums in den SQL-String.



Wenn mit Parameter-Objekten gearbeitet wird, ist nichts umzuwandeln.

Mir ist auch aufgefallen, dass mir bei dieser Vorgehensweise die
Typisierung
überhaupt nichts nutzt.



Wie meinst du das?

Natürlich würde ich viel lieber mit parametrisierten Abfragen arbeiten.
Aber
auch dort komme ich nicht weiter.



Wenn das Prinzip "der Letzte gewinnt" realisiert wird, dann ist das recht
einfach, da sich die Where-Klausel nur auf die Identifikation des zu
aktualisierenden Datensatzes bezieht. Wie die SQL Anweisung im Falle der
Prüfung auf Konkurrenzbedingung auszusehen hat, kann man sich vom
CommandBuilder zeugen lassen.

Bei der Erstellung der Parameter ist jeweils die Angabe des Datentyps
erforderlich (z.B. OleDbType, SqlDbType). In der Tabelle steht aber, ganz
gleich ob typisiert oder untypisiert, immer nur der .NET-Typ.



Der Datentyp kann aber von der Datenbank abgefragt werden, z.B. über
GetOledbSchema.

Was kann ich tun und gibt es vielleicht noch eine elegantere Lösung?



Ein alternativer Lösungsweg wàre die Nutzung des CommandBuilders mit
nachfolgendem Löschen der nicht verànderten Felder.

Viele Grüsse
Peter

Ähnliche fragen