Announcement

Collapse
No announcement yet.

Viele Datensätze auf SQL Server speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Viele Datensätze auf SQL Server speichern

    Hallo,

    über einen Webdienst bekomme ich ein Objekt übermittelt, das für Datensätze für eine SQL-Servertabelle enthält.
    Momentan gehe ich das Objekt mit einer For each Schleife durch und erstelle für jede zeile eine Insert-Anweisung auf dem SQL Server. Gerade bei großen Mengen ist das nicht sehr performat.

    Gibt es da andere Möglichkeiten (z.B. alles erstmal irgendwie sammeln und mit einer Anweisung hochschieben )

    Danke
    Christina

  • #2
    Hallo Christina,

    wenn die Daten in einer DataTable "ankommen", ist es natürlich sinnvoll, diese zu nutzen. Dazu gibt es mehrere Möglichkeiten.

    Wenn DataRowState als Added eingetragen wurde, dann genügt DbDataAdapter mit einem InsertCommand, das ggf. automatisch erstellt wurde.

    Andernfalls kannst du mit DataTable.Merge dies in einer neuen DataTable erreichen.

    Du kannst in der Tat (wie du es jetzt gemacht hast) einen eigenen Insert-Befehl benutzen. Diesen solltest du aber unbedingt nur einmal erzeugen und alle Spalten per Parameter eintragen. Außerdem ist der gesamte Ablauf unbedingt in eine Transaction einzubinden, das wäre der größte Beschleuniger. Struktur:
    Code:
    erzeuge SqlCommand cmd
    füge cmd.Parameters.Add (aber ohne die Werte!)
    erzeuge SqlTransaction
    Transaction.Begin
    foreach(DataRow in DataTable)
       cmd.Parameters[ParamName].Value = ...
       cmd.ExecuteNonQuery
    Transaction.Commit
    Gruß Jürgen

    Comment


    • #3
      Verwendung von prepared Statements bring viel. Ebenfalls das zusammenfassen von mehreren Inserts zu einem Bulk-Insert bringt auch noch einiges.

      Comment


      • #4
        Ab SQL Server 2008 geht INSERT INTO auch für mehrere Zeilen.
        Einfach mehrere Wertelisten hinter VALUES angeben und mit Komma trennen. Also z.B so


        Code:
        INSERT INTO MeineLiebeTabelle(Spalte1, Spalte2) 
        VALUES ('Hallo', 'Welt'), ('Gute', 'Nacht')

        Comment


        • #5
          Originally posted by Ralf Jansen View Post
          Ab SQL Server 2008 geht INSERT INTO auch für mehrere Zeilen.
          Dazu braucht man keine 2008er Version. Geht auch schon früher.

          Comment


          • #6
            Dazu braucht man keine 2008er Version. Geht auch schon früher.
            Sicher? Habe leider keinen 2005er DB zur Hand. Wenn man der Syntaxbeschreibung der MSDN Hilfe zu INSERT INTO für denn 2005er folgt kann der das nicht. Würde mich aber auch nicht wundern wenn die Hilfe einfach falsch ist.

            Und die 2008er Hilfe beschreibt es als neues Feature

            In SQL Server 2008 wird der Transact-SQL-Zeilenkonstruktor (auch Tabellenwertkonstruktor genannt) eingeführt, mit dem mehrere Zeilen in einer einzelnen INSERT-Anweisung angegeben werden können.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Sicher? Habe leider keinen 2005er DB zur Hand. Wenn man der Syntaxbeschreibung der MSDN Hilfe zu INSERT INTO für denn 2005er folgt kann der das nicht. Würde mich aber auch nicht wundern wenn die Hilfe einfach falsch ist.

              Und die 2008er Hilfe beschreibt es als neues Feature
              OK, bei "alten" SQL-Servern muss man noch die herkömliche Syntax verwenden die vermutlich etwas langsamer ist:

              Code:
              INSERT INTO MeineLiebeTabelle(Spalte1, Spalte2) VALUES ('Hallo', 'Welt')
              INSERT INTO MeineLiebeTabelle(Spalte1, Spalte2) VALUES ('Gute', 'Nacht')
              Aber gut zu wissen das MS hier von MySQL geklaut hat. MySQL kann das nämlich schon lange :-)

              Comment

              Working...
              X