none
Ist das ein Fehler bei SQLBulkCopy? RRS feed

  • Frage

  • Hallo,
    ich mache in VB.net folgendes:

    Using bulkcopy As New SqlBulkCopy(connection)
    Dim result() As DataRow = srcTable.Select("", "nr ASC") bulkcopy.WriteToServer(result)

    ................

    (ist sicher verständlich, ohne dass ich genaueres erkläre dazu)

    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

    Montag, 7. März 2016 22:26

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
    Dienstag, 8. März 2016 07:59
  • 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

    Dienstag, 8. März 2016 09:06
  • ... 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:

    1. Die Ziel-SQLTabelle muss identisch zur Quell-SQLTabelle definiert werden, also vollkommen gleiche Spalten
    2. 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
    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 

    https://social.technet.microsoft.com/Forums/de-DE/60751f71-8ac0-4feb-8e35-400b4f2a92b1/datentabelle-sortierung-permanent-machen-via-ssms?forum=sqlserverexpressde


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Dienstag, 8. März 2016 05:15
  • Hi Benjamin,

    OK, aber es ist schon ein wenig "unlogisch und unpraktisch" für einen Kopiervorgang. :o)

    Grüße-


    Dietrich

    Dienstag, 8. März 2016 07:49
  • 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
    Dienstag, 8. März 2016 07:59
  • 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

    Dienstag, 8. März 2016 09:06
  • 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

    Dienstag, 8. März 2016 09:20
    Moderator
  • 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

    Dienstag, 8. März 2016 09:38
  • Auch wenn dir die Antworten leider nicht zusagen, würde ich dich doch bitten die beiden Fragen zu schließen und die entsprechenden Posts als Antwort markieren. 

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Dienstag, 8. März 2016 09:55
  • 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

    Dienstag, 8. März 2016 10:05
    Moderator
  • ... 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:

    1. Die Ziel-SQLTabelle muss identisch zur Quell-SQLTabelle definiert werden, also vollkommen gleiche Spalten
    2. 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
    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

    Mittwoch, 9. März 2016 21:31
    Moderator
  • 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

    Mittwoch, 9. März 2016 22:14