Benutzer mit den meisten Antworten
Ist das ein Fehler bei SQLBulkCopy?

Frage
-
Hallo,
ich mache in VB.net folgendes:
(ist sicher verständlich, ohne dass ich genaueres erkläre dazu)Using bulkcopy As New SqlBulkCopy(connection)
Dim result() As DataRow = srcTable.Select("", "nr ASC") bulkcopy.WriteToServer(result)................
Wenn ich das Array 'result' kontrolliere, sehe ich, dass es korrekt sortiert ist nach 'nr'. Aber wenn ich nach dem Kopieren von 'result' die SQL-Tabelle anschaue, so sind die Datensätze zwar in der Zieltabelle vorhanden, aber eben NICHT sortiert.
Ja, ist das nun ein Fehler des System?Grüße-
Dietrich
Antworten
-
Daran ist nichts unlogisch, sondern ganz im Gegenteil das gewollte und standalisierte Verhalten von Datenbanksystemen.
Was ist daran unpraktisch. Dein Problem ist dass du als Programmierer denkst. In der Programmentwicklung (egal ob objektorientiert oder funktional) sind z.B. die Positionen in einem Array wichtig. Dies gilt aber nicht für Datenbanken. Wenn du in einer Tabelle einen bestimmten Wert ansprechen willst, macht man dies nicht mit der Position in der Tabelle sondern über einen Schlüsselwert (wie Primärschlüssel oder ein eindeutiger Index).
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Als Antwort markiert dherrmann Dienstag, 8. März 2016 09:58
-
Vielleicht wird ja mit dem folgendem Beispiel die Arbeitsweise des SQL Server deutlicher
nehmen wir ein Array
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
B | e | i | s | p | i | e | l |
Auch wenn es nicht ganz deutlich ist. Jede Array Position speichert genau einen Buchstaben des Wortes "Beispiel"
Läuft man von vorne nach hinten durch das Array kommt auch wieder das Wort Beispiel heraus.
Jetzt speichert man die einzelen Array Positionen in einer SQL Server Tabelle. Dem SQL Server ist die Reihenfolge egal. Wenn die Reihe wichtig ist dann muss man eine Schlüsselwert mitgeben welcher die logische Reihenfolge abbildet.
ID | Wert
1 | e
7 | l
3 | s
4| p
6 | i
0 | B
2 | i
Wenn man nun das 3 Zeichen haben möchte dann würde man im Array die Position 2 abfragen. Im SQL Server würde man schrieben
select Wert from tabelle where ID = 2
In beiden Fällen wäre das Ergebnis das Zeichen i, obwohl in der Tabelle des SQL Server der Wert an 7. Stelle steht.
Um das komplette Wort zu erhalten wäre dann
select Wert from Tabelle order by ID
Ich hoffe mal der Unterschied zwischen Array und Datenbank Tabelle ist deutlicher geworden.
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 8. März 2016 09:33
- Als Antwort markiert dherrmann Dienstag, 8. März 2016 09:59
-
... das Problem ist IMO eher dein fehlendes Verständnis der Arbeitsweise von Datenbanksystemen. Es gibt für das, was Du machen willst, keine Lösung mit einem klassischen Datenbanksystem.
Hallo Stefan,
da ist kein fehlendes Verständnis meinerseits, das muss ich wohl nochmals betonen!
Aber mittlerweile habe ich mit VisualStudio VB.net eine eigene kleine Lösung gefunden, die ich mir erlaube hier in groben Zügen zu erklären:
- Aus der unsortierten SQL-Tabelle erzeuge ich eine DataTable mittels SQLDataAdapter
- Auf diese DataTable wende ich ein DataView an, das ich nach meinem Vorhaben sortiere
- Aus dem DataView erzeuge ich eine neu DataTable, die nun sortiert ist
- Diese DataTable kopiere ich nun mittels SQLBulkCopy in eine vordefinierte SQL-Tabelle des Servers
Für den korrekten Ablauf sind zwei Punkte unerlässlich:
- Die Ziel-SQLTabelle muss identisch zur Quell-SQLTabelle definiert werden, also vollkommen gleiche Spalten
- Beide Tabellen müssen zwingend eine PrimärKey-Spalte haben (die man nach dem Prozess auch wieder löschen könnte)
Da es sich bei meinen Tabellen um relativ kleine handelt, die ich so behandeln muss, ist das Zeitverhalten vernachlässigbar.
Gute Nacht und Grüße-
Dietrich
- Als Antwort markiert dherrmann Mittwoch, 9. März 2016 20:26
Alle Antworten
-
Nein, dies ist kein Fehler.
Du kannst die Daten nicht so sortiert speichern, selbst wenn die Daten in der richtigen Reihenfolge gespeichert wären garantiert es dir nicht, dass auch die Ausgabe so sortiert ist. So arbeiten Datenbanksysteme nun mal nicht.
siehe auch
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 8. März 2016 09:32
-
Daran ist nichts unlogisch, sondern ganz im Gegenteil das gewollte und standalisierte Verhalten von Datenbanksystemen.
Was ist daran unpraktisch. Dein Problem ist dass du als Programmierer denkst. In der Programmentwicklung (egal ob objektorientiert oder funktional) sind z.B. die Positionen in einem Array wichtig. Dies gilt aber nicht für Datenbanken. Wenn du in einer Tabelle einen bestimmten Wert ansprechen willst, macht man dies nicht mit der Position in der Tabelle sondern über einen Schlüsselwert (wie Primärschlüssel oder ein eindeutiger Index).
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Als Antwort markiert dherrmann Dienstag, 8. März 2016 09:58
-
Vielleicht wird ja mit dem folgendem Beispiel die Arbeitsweise des SQL Server deutlicher
nehmen wir ein Array
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
B | e | i | s | p | i | e | l |
Auch wenn es nicht ganz deutlich ist. Jede Array Position speichert genau einen Buchstaben des Wortes "Beispiel"
Läuft man von vorne nach hinten durch das Array kommt auch wieder das Wort Beispiel heraus.
Jetzt speichert man die einzelen Array Positionen in einer SQL Server Tabelle. Dem SQL Server ist die Reihenfolge egal. Wenn die Reihe wichtig ist dann muss man eine Schlüsselwert mitgeben welcher die logische Reihenfolge abbildet.
ID | Wert
1 | e
7 | l
3 | s
4| p
6 | i
0 | B
2 | i
Wenn man nun das 3 Zeichen haben möchte dann würde man im Array die Position 2 abfragen. Im SQL Server würde man schrieben
select Wert from tabelle where ID = 2
In beiden Fällen wäre das Ergebnis das Zeichen i, obwohl in der Tabelle des SQL Server der Wert an 7. Stelle steht.
Um das komplette Wort zu erhalten wäre dann
select Wert from Tabelle order by ID
Ich hoffe mal der Unterschied zwischen Array und Datenbank Tabelle ist deutlicher geworden.
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 8. März 2016 09:33
- Als Antwort markiert dherrmann Dienstag, 8. März 2016 09:59
-
Hallo Dietrich,
das Thema wurde doch in deinem anderen Thread:
Datentabelle: Sortierung permanent machen via SSMS
ausgiebigst behandelt. Daher verstehe ich nicht wirklich, warum Du jetzt eigentlich genau dasselbe nochmal fragst!?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
ja natürlich MUSS ich das Ganze als Programmierer sehen und ich meine, wenn sich was "Kopier-Funktion" nennt, also das 1:1-Erzeugen einer Kopie von einem Original, sollte sie auch so funktionieren, ob es sich dabei um Datenbank-Objekte handelt oder irgenwas anderes.
Und das BulkCopy überträgt sortierte Daten NICHT, egal ab es Sätze aus einer DataTable oder aus einem Array sind. Sorry.
Ich beende hiermit die Diskussion und suche mal bisschen weiter nach anderen Wegen ;-)
Grüße-
Dietrich
-
Hallo Dietrich,
das Problem ist IMO eher dein fehlendes Verständnis der Arbeitsweise von Datenbanksystemen. Es gibt für das, was Du machen willst, keine Lösung mit einem klassischen Datenbanksystem.
Klar darfst Du gerne weiter suchen aber Du wirst nichts finden. Ich frage mich aber eh, warum Du dermaßen viel Aufwand in die Suche nach etwas steckst, was es nicht gibt anstelle einfach mit ORDER BY ... zu arbeiten. Aber das ist deine Sache.
Speicher die Werte in einer XML Datei oder einem anderen Format, welches Du dann auch hinsichtlich der genauen Speicherposition der Elemente beeinflussen kannst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
... das Problem ist IMO eher dein fehlendes Verständnis der Arbeitsweise von Datenbanksystemen. Es gibt für das, was Du machen willst, keine Lösung mit einem klassischen Datenbanksystem.
Hallo Stefan,
da ist kein fehlendes Verständnis meinerseits, das muss ich wohl nochmals betonen!
Aber mittlerweile habe ich mit VisualStudio VB.net eine eigene kleine Lösung gefunden, die ich mir erlaube hier in groben Zügen zu erklären:
- Aus der unsortierten SQL-Tabelle erzeuge ich eine DataTable mittels SQLDataAdapter
- Auf diese DataTable wende ich ein DataView an, das ich nach meinem Vorhaben sortiere
- Aus dem DataView erzeuge ich eine neu DataTable, die nun sortiert ist
- Diese DataTable kopiere ich nun mittels SQLBulkCopy in eine vordefinierte SQL-Tabelle des Servers
Für den korrekten Ablauf sind zwei Punkte unerlässlich:
- Die Ziel-SQLTabelle muss identisch zur Quell-SQLTabelle definiert werden, also vollkommen gleiche Spalten
- Beide Tabellen müssen zwingend eine PrimärKey-Spalte haben (die man nach dem Prozess auch wieder löschen könnte)
Da es sich bei meinen Tabellen um relativ kleine handelt, die ich so behandeln muss, ist das Zeitverhalten vernachlässigbar.
Gute Nacht und Grüße-
Dietrich
- Als Antwort markiert dherrmann Mittwoch, 9. März 2016 20:26
-
Hallo Dietrich,
da ist kein fehlendes Verständnis meinerseits, das muss ich wohl nochmals betonen!
ohne das böse zu meinen: Ich seh das anders. Das, was Du willst, gibt es in der benötigten Form nicht. Dass deine "Lösung" zufälligerweise die Daten in der von dir benötigten Form ausgibt, hat nichts damit zu tun, dass es eine Lösung wäre, sondern lediglich, dass es eben zufälligerweise klappt. Verlassen solltest Du dich aber nicht darauf.
Aber so oder so: Ich (und einige andere wohl auch) verstehen immer noch nicht, warum Du das überhaupt so machen willst? Es gibt für mich keinen einzigen Grund, sich überhaupt mit sowas zu befassen. Da Du ja anscheinend einen Grund hast, würde mich interessieren, welcher das wäre.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Nun gut, es wird sich zeigen, ob diese Methode NUR zufällig funktioniert; es ist jetzt programmiert und so kann man verschiedene Versuche machen.
Jetzt habe ich jedenfalls erst mal meine sortierte Tabelle...Erklärungsversuch:
Eigentlich einfach - ich möchte nicht im SSMS eine Tabelle aufmachen und immer erst der SELECT-Anweisung ein ORDER BY verpassen müssen. Ich möchte die Daten beim ersten Blick gleich geordnet sehen können; vor allem, wenn es eine Tabelle ist, die letztlich kaum Änderungen unterworfen ist, sondern nur in längeren Abständen ergänzt wird. Es sind sozusagen Archivierungs-Tabellen für die Langzeitspeicherung von Daten. Eine Sicht will ich auch nicht extra führen.
Grüße-
Dietrich