Exceltabelle in Sql via Update.Befehl

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von petaod.

    Exceltabelle in Sql via Update.Befehl

    UPDATE: Der Code zur BULK-COPY funktioniert (Es hat lediglich der Pfad im ConnectionString nicht gestimmt). Die Update-Sache funktioniert aber weiterhin nicht. Wenn ich die BULK-COPY mehrmals ausführe erhalte ich einen Fehler im Sinne von: "Manche Datensätze mit den selben PrimaryKeys sind bereits vorhanden -> kopieren fehlgeschlagen" Wie umgehe ich dieses Problem. Ich möchte sowohl nicht vorhandene Datensätze hinzufügen als auch vorhandene Datensätze updaten.

    ------------------------------------------------------------------------------------------------------

    Hallo zusammen,

    mit dem folgenden Code versuche ich eine Excelmappe in ein Dataset einzulesen und dann dieses Dataset via Updatecommand in die Datenbank zu befördern. Das Dataset wird korrekt mit den Daten aus der Exceldatei befüllt. Auch der Rest des Codes läuft durch ohne einen Fehler auszugeben. Sobald ich die Anwendung beende und im Datenbankexplorer den Tabelleninhalt meiner Datenbank prüfen will muss ich leider jedes mal feststellen, dass trotz fehlerfreien Durchlaufs keine Daten übertragen werden.
    Ein anderer Lösungsansatz mittels Bulk-Copy führt leider zu dem selben Ergebnis (fehlerfreier Durchlauf, keine Daten übertragen)
    Was mache ich hier falsch? Gibt es alternative Lösungsansätze bzw. ist meiner vielleicht total ungeeignet?

    Vielen Dank im Voraus


    VB.NET-Quellcode

    1. 'UPDATECOMMAND METHODE
    2. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    3. Dim DS As System.Data.DataSet
    4. Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    5. Dim MyConnectionExcel As System.Data.OleDb.OleDbConnection
    6. MyConnectionExcel = New System.Data.OleDb.OleDbConnection( _
    7. "Provider=Microsoft.ACE.OLEDB.12.0; " & _
    8. "data source=C:\Users\qxf8451\Desktop\export.xlsx; " & _
    9. "Extended Properties=Excel 12.0;")
    10. ' Select the data from Sheet1 of the workbook.
    11. MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
    12. "select * from [Sheet1$]", MyConnectionExcel)
    13. DS = New System.Data.DataSet()
    14. MyCommand.Fill(DS)
    15. Dim keyColumn(2) As DataColumn
    16. keyColumn(0) = DS.Tables(0).Columns("Bestellnummer") 'Die Spaltenüberschrift in der Exceldatei
    17. keyColumn(1) = DS.Tables(0).Columns("Bestellposition") 'Die Spaltenüberschrift in der Exceldatei
    18. DS.Tables(0).PrimaryKey = keyColumn
    19. ' Create a new Connection and SqlDataAdapter
    20. Dim myConnection As SqlConnection
    21. Dim mySqlDataAdapter As SqlDataAdapter
    22. myConnection = new SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\qxf8451\Desktop\VS Beschaffungsmanager 2015\VS Beschaffungsmanager 2015\bin\Debug\DB_Beschaffungsmanager.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
    23. mySqlDataAdapter = New SqlDataAdapter("Select * from tblSapDaten", myConnection)
    24. 'Dim myDataSet as DataSet = new DataSet()
    25. 'Dim myDataRow As DataRow
    26. ' Create command builder. This line automatically generates the update commands for you, so you don't
    27. ' have to provide or create your own.
    28. Dim myDataRowsCommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(mySqlDataAdapter)
    29. ' Set the MissingSchemaAction property to AddWithKey because Fill will not cause primary
    30. ' key & unique key information to be retrieved unless AddWithKey is specified.
    31. mySqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    32. mySqlDataAdapter.UpdateCommand = myDataRowsCommandBuilder.GetUpdateCommand(True)
    33. mySqlDataAdapter.InsertCommand = myDataRowsCommandBuilder.GetInsertCommand(True)
    34. mySqlDataAdapter.Update(DS, "Table")
    35. mySqlDataAdapter.AcceptChangesDuringUpdate = True
    36. MyConnectionExcel.Close()
    37. End Sub




    VB.NET-Quellcode

    1. 'BULK-COPY METHODE
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim sqlConnectionZiel As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\qxf8451\Desktop\VS Beschaffungsmanager 2015\VS Beschaffungsmanager 2015\bin\Debug\DB_Beschaffungsmanager.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
    4. Dim OleDbConnectionQuelle As New System.Data.OleDb.OleDbConnection( _
    5. "Provider=Microsoft.ACE.OLEDB.12.0; " & _
    6. "data source=C:\Users\qxf8451\Desktop\export.xlsx; " & _
    7. "Extended Properties=Excel 12.0;")
    8. Dim oleDbccommandBackup As OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("select * from [Sheet1$]", OleDbConnectionQuelle)
    9. OleDbConnectionQuelle.Open()
    10. sqlConnectionZiel.Open()
    11. Dim oledbReader As OleDbDataReader = oleDbccommandBackup.ExecuteReader
    12. Using sqlbulkcopy As New SqlBulkCopy(sqlConnectionZiel)
    13. sqlbulkcopy.DestinationTableName = "tblSapDaten"
    14. sqlbulkcopy.WriteToServer(oledbReader)
    15. OleDBConnectionQuelle.Close()
    16. sqlConnectionZiel.Close()
    17. End Using
    18. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TheProfessor“ ()

    TheProfessor schrieb:

    MyConnectionExcel = New System.Data.OleDb.OleDbConnection( _
    "Provider=Microsoft.ACE.OLEDB.12.0; " & _
    "data source=C:\Users\qxf8451\Desktop\export.xlsx; " & _
    "Extended Properties=Excel 12.0;")
    Eigentlich wundert mich, dass das überhaupt funktioniert.

    Visual Basic-Quellcode

    1. ​MyConnectionExcel = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\Users\qxf8451\Desktop\export.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    Man beachte die Quotes bei den extended properties!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --