Datagridview in Access Datenbank Tabelle speichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Silentwolf.

    Datagridview in Access Datenbank Tabelle speichern

    Hallo an alle,

    ich weiß das dieses Thema schon einige male besprochen wurde aber ich komme leider trotzdem nicht wirklich weiter und hoffe auf ein paar Tips oder Hilfe.
    Bin leider noch ein wenig neu auf VB.net und deshalb hoffe ich Ihr seid nicht all zu streng mit mir ;)

    Folgende Situation:
    • Ich lade in einer Form mit Datagridview Daten einer Excel Tabelle. Das passiert mit "Imports System.Data.Oleb" das funktioniert bereits
    • Weiters habe ich eine Klasse die den Zugriff auf die Datenbank liefert wiederum mit OleDbConnection (dazu habe ich diese Klasse mal als Code reingestellt) hoffe das ist ok?
    • Nun in meiner Form wo das Datagridview Element enthalten ist habe ich noch button der mir diese Daten in die Datenbank übergeben soll erstellt.
    Nun möchte ich diese Daten in die Datenbank einlesen habe aber diesbezüglich noch ein wenig Probleme um die Parameter zu setzen die ich dazu benötige (Mein bisheriger Ansatz habe ich auch eingefügt)

    DBControl Code ist nicht von mir erarbeitet!

    Quellcode

    1. Imports System.Data.OleDb
    2. Public Class DBControl
    3. 'CREATE Your DB Connection
    4. Private DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
    5. "Data Source =DB_Main.accdb;")
    6. 'PREPARE DB COMMAND
    7. Private DBCmd As OleDbCommand
    8. 'DB DATA
    9. Public DBDA As OleDbDataAdapter
    10. Public DBDT As DataTable 'Anstatt Datatable as writem by vb.tutorial
    11. 'QUERY PARAMETERS
    12. Public Params As New List(Of OleDbParameter)
    13. 'QUERY STATISTICS
    14. Public RecordCount As Integer
    15. Public Exeption As String
    16. Public Sub ExecQuery(Query As String)
    17. 'RESET QUERY STATS
    18. RecordCount = 0
    19. Exeption = ""
    20. Try
    21. 'OPEN A CONNECTION
    22. DBCon.Open()
    23. 'CREATE DB COMMAND
    24. DBCmd = New OleDbCommand(Query, DBCon)
    25. 'LOAD PARAMS INTO DB COMMAND
    26. Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))
    27. 'CLEAR PRARAMS LIST
    28. Params.Clear()
    29. 'EXECUTE COMMAND & FILL DATATABLE
    30. DBDT = New DataTable
    31. DBDA = New OleDbDataAdapter(DBCmd)
    32. RecordCount = DBDA.Fill(DBDT) 'hab ich von DBDT auf DBDS geändert?
    33. Catch ex As Exception
    34. Exeption = ex.Message
    35. End Try
    36. 'CLOSE YOUR CONNECTION
    37. If DBCon.State = ConnectionState.Open Then DBCon.Close()
    38. End Sub
    39. 'INCLUDE QUERY & COMMAND PARAMETERS
    40. Public Sub AddParam(Name As String, Value As Object)
    41. Dim NewParam As New OleDbParameter(Name, Value)
    42. Params.Add(NewParam)
    43. End Sub
    44. End Class


    Quellcode

    1. Imports System.Data.OleDb
    2. Public Class ExcelImport
    3. Private Access As New DBControl 'Referenz zu DBControl Klasse
    4. Dim conn As OleDbConnection
    5. Dim dta As OleDbDataAdapter
    6. Dim dts As DataSet
    7. Dim excel As String
    8. Dim OpenFileDialog As New OpenFileDialog
    9. Private Sub btnImport_Click(sender As Object, e As EventArgs) Handles btnImport.Click
    10. Try
    11. OpenFileDialog.InitialDirectory = "Y:\MMM\NNN"
    12. OpenFileDialog.Filter = "Text Files |*.csv| Excel Dateien |* .xls| Excel Dateien |* .xlsx| Alle Dateien |*.*"
    13. If OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
    14. Dim fi As New IO.FileInfo(OpenFileDialog.FileName)
    15. Dim FileName As String = OpenFileDialog.FileName
    16. excel = fi.FullName
    17. conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + excel + ";Extended Properties=Excel 12.0;")
    18. dta = New OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn)
    19. dts = New DataSet
    20. dta.Fill(dts, "[Sheet1$]")
    21. dgvExcel.DataSource = dts
    22. dgvExcel.DataMember = "[Sheet1$]"
    23. conn.Close()
    24. End If
    25. Catch ex As Exception
    26. MsgBox(ex.Message)
    27. conn.Close()
    28. Exit Sub
    29. End Try
    30. End Sub
    31. Private Sub btnSendToAccess_Click(sender As Object, e As EventArgs) Handles btnSendToAccess.Click
    32. Dim DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
    33. "Data Source =DB_Main.accdb;")
    34. Try
    35. Dim i As Integer
    36. If MsgBox("Die Daten in Datenbank speichern?", CType(vbYesNo + vbQuestion, Global.Microsoft.VisualBasic.MsgBoxStyle)) = vbYes Then
    37. For i = 0 To dgvExcel.RowCount - 1
    38. DBCon.Open()
    39. 'ADD PARAMETERS
    40. Access.AddParam("@IBAN", dgvExcel)
    41. Access.AddParam("@Auszugsnummer", dgvExcel)
    42. Next
    43. End If
    44. Catch ex As Exception
    45. DBCon.Close()
    46. MsgBox(ex.Message, vbCritical)
    47. End Try
    48. End Sub
    49. End Class


    Ich denke das es kein großes Problem ist aber leider komme ich selbst nicht weiter und hoffe das mir hier jemand helfen könnte um die Parameter richtig zu setzen für das Datagridview Element.

    Vielen herzlichen Dank!

    Gruß SW

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

    Hallo einen Nachtrag,

    ich habe noch andere Lösungen zu meinen Problem gefunden und diesbezüglich meinen Code geändert.

    Quellcode

    1. Private Sub InsertInto()
    2. Dim DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
    3. "Data Source =DB_Main.accdb;")
    4. Dim Com As OleDbCommand
    5. Dim IBAN As String
    6. Dim Auszugsnummer As Integer
    7. Dim Buchungsdatum As Date
    8. Dim Valutadatum As Date
    9. Dim Umsatzzeit As String
    10. Dim Zahlungsreferenz As String
    11. Dim Waehrung As String
    12. Dim Betrag As Double
    13. Dim Buchungstext As String
    14. Dim Umsatztext As String
    15. Dim StrInto As String
    16. Com = New OleDbCommand
    17. Com.Connection = DBCon
    18. DBCon.Open()
    19. Dim i As Integer
    20. If MsgBox("Die Daten in Datenbank speichern?", CType(vbYesNo + vbQuestion, Global.Microsoft.VisualBasic.MsgBoxStyle)) = vbYes Then
    21. For i = 0 To dgvExcel.RowCount - 1
    22. IBAN = CStr(dgvExcel.Rows(i).Cells(0).Value)
    23. Auszugsnummer = CInt(dgvExcel.Rows(i).Cells(1).Value)
    24. Buchungsdatum = CDate(dgvExcel.Rows(i).Cells(2).Value)
    25. Valutadatum = CDate(dgvExcel.Rows(i).Cells(3).Value)
    26. Umsatzzeit = CStr(dgvExcel.Rows(i).Cells(4).Value)
    27. Zahlungsreferenz = CStr(dgvExcel.Rows(i).Cells(5).Value)
    28. Waehrung = CStr(dgvExcel.Rows(i).Cells(6).Value)
    29. Betrag = CDbl(dgvExcel.Rows(i).Cells(7).Value)
    30. Buchungstext = CStr(dgvExcel.Rows(i).Cells(8).Value)
    31. Umsatztext = CStr(dgvExcel.Rows(i).Cells(9).Value)
    32. StrInto = "INSERT INTO VB_Import(IBAN, Auszugsnummer, Buchungsdatum, Valutadatum, Umsatzzeit, Zahlungsreferenz, Waehrung, Betrag, Buchungstext, Umsatztext) VALUES(@IBAN, @Auszugsnummer, @Buchungsdatum, @Valutadatum, @Umsatzzeit, @Zahlungsreferenz, @Waehrung, @Betrag, @Buchungstext, @Umsatztext)"
    33. Dim Comm As New OleDbCommand(StrInto, DBCon)
    34. Comm.Parameters.AddWithValue("@IBAN", IBAN)
    35. Comm.Parameters.AddWithValue("@Auszugsnummer", Auszugsnummer)
    36. Comm.Parameters.AddWithValue("@Buchungsdatum", Buchungsdatum)
    37. Comm.Parameters.AddWithValue("@Valutadatum", Valutadatum)
    38. Comm.Parameters.AddWithValue("@Umsatzzeit", Umsatzzeit)
    39. Comm.Parameters.AddWithValue("@Zahlungsreferenz", Zahlungsreferenz)
    40. Comm.Parameters.AddWithValue("@Waehrung", Waehrung)
    41. Comm.Parameters.AddWithValue("@Betrag", Betrag)
    42. Comm.Parameters.AddWithValue("@Buchungstext", Buchungstext)
    43. Comm.Parameters.AddWithValue("@Umsatztext", Umsatztext)
    44. Comm.ExecuteNonQuery()
    45. Comm.Dispose()
    46. Next
    47. DBCon.Close()
    48. End If
    49. End Sub


    Leider bekomme ich eine Exception: 'Parameter@IBAN hat keinen Standardwert.'

    Woran liegt das? Kann mir hier wer bitte sagen was ich ändern muss ?

    Sonst glaub ich ist das nun der richtige Weg um die Daten in die DB zu übergeben...

    Wäre sehr dankbar für Hilfe!

    Gruß
    SW
    also ich würde da im Lokal-Fenster nachgucken, wenn die Exception kommt.
    Offsichtlich stimmt iwas nicht mit dem Iban-Parameter.

    Das Daten 100% richtig sind, da waren sich schon viele Entwickler absolut totsicher. Gottlob stirbt man dennoch nicht, wenn man sich irrt, sonst wär in der Entwicklerbranche aber wirklich Fachkräfte-Mangel. ;)
    Lach ja das stimmt sicher aber im diesen Fall muss ich sagen das IBAN wirklich überall drinnen ist ..)
    Sehe ich ja auch im Datagridview Element..
    Hab jetzt mal im Lokalfenster geschaut aber komme da auch noch eher schlecht als recht zurecht ...
    Also die Datenquelle hat in der ersten Row eine Überschrift könnte das etwas zu tun haben mit meinen Code? Wenn ich bei der Exeption dann einfach auf F11 geht führt der Code ohne Problem bis zum Ende aus

    Danke
    Nee - nicht F11 drücken und gucken, wies "problemlos" weiter geht. Exceptions sind nicht dazu da, dasses danach weitergeht wie bisher - sowas gibts nur inne Politik.
    Wenn die exception kommt und der Code hält, dann schau zB, welchen Wert die Variable i hat - die müsste doch genau die Zeile angeben, wo irgendwas mit den Daten nicht stimmt.

    Wenn i > 0 ist, und kleiner als die Gesamtzahl der Zeilen, dann liegt das Problem in einer bestimmten Zeile.

    Ah - probier auch mal so:

    VB.NET-Quellcode

    1. For i = 0 To dgvExcel.RowCount - 2
    Die letzte DGV-Zeile ist oft eine leere Zufügezeile. Vlt ist es das, was nicht verarbeitet werden kann.
    Bessere Abhilfe ist dann aber Zufügen nicht zu erlauben, aber zum debuggen reicht erstmal das mit dgvExcel.RowCount - 2
    Hallo Danke ich für Deinen Hinweiß,

    Also es zeigt mir im Lokalfenster an das i 69 ist in den Testdaten habe ich bis Zeile 70 Daten..
    Zudem ist die IBAN aber auch alle anderen Daten auf Nothing ausser zwei Datumsfelder die stehen auf 1/1/1001

    Ich habe schon versucht die Testdaten unterhalb der letzten Zeile zu löschen um eventuelle Restdaten zu eliminieren aber auch das hat keinen Unterschied gebracht.

    Zudem wenn ich eine andere Datei einfügen wollte hat es ir eine Fehlermeldung gebracht bevor die dgv geladen wurde
    Sheet1$ ist kein gültiger Name. Stellen Sie sicher, das der Name nicht zu lang ist und keine ungültigen Zeichen oder Interpunktionszeichen enthält.

    Also ich habe in der ersten Tabelle der zu importierenden Tabelle den Namen auf Test geändert und und das selbe in grün.. die selbe Fehlermeldung..

    Stimmt mit meinen Code doch etwas nicht oder gibt es eine bessere Methode um das Datagrid zu füllen?
    Gibt ja so viele unterschiedliche Methoden in Vb.net da ist es schwierig zu verstehen welche die "beste" ist..

    Schönen Gruß
    SW

    Silentwolf schrieb:

    gibt es eine bessere Methode um das Datagrid zu füllen?

    oh ja!!

    Allerdings muss man dazu verschiedene geniale Konzepte als ein Gesamtkunstwerk verstehen.
    Also statt ein DGV zu füllen sollte man es an eine typisierte Datatable binden.
    Dann befüllt es sih selbst.

    Im Nachgang ist dann also nur noch das typisierte Dataset zu befüllen aus der Datenbank.
    Dafür gibt es DataAdapter, die nicht nur die DataTable befüllen, sondern die können auch Änderungen an den Daten zurückschreiben in die Datenbank.
    Hallo,
    danke für die Nachricht!

    Also nach DataAdapter suchen?
    Leider muss ich gleich nochmal los aber ich werde mich da mal ranmachen um es besser zu verstehen.
    Oder hast Du zufällig ein "Tutorial" oder dergleichen das Du mir anhängen könntest das ich mir ansehen könnte?
    Wäre sehr hilfreich um mehr darüber zu lernen.

    Da ich viele Daten die als CSV oder in Excel vorliegen verarbeiten muss wäre ein Hinweis auf eine vernünftige Art und Weise wie man das machen soll sehr
    hilfreich da ich ja noch in den Kinderschuhen der VB.Net programmierung stecke und viele Infos dazu halt schon älter sind und sicherlich schon überarbeitet oder
    verbessert sind.
    Aber da fehlt mir halt noch das Verständnis welche Möglichkeiten sinnvoll sind.

    Vielen Dank erstmal und schönen Gruß

    Silentwolf schrieb:

    Kinderschuhen
    sind bei Datenbank-Anwendungen allerhöchst-problematisch.
    Um was brauchbares hinzukriegen muss man vb.net einigermassen können. Und darüberhinaus das Wesen relationaler Datenbanken verstehen.
    Ansonsten kopiert man sich allen möglichen Mist zusammen, und erzeugt unter Riesen-Arbeits-Aufwand - doch nur weiteren Mist.

    Ich hab hier einen Meta-Link, also der verlinkt auf weiteres, und von da noch weiter etc: Datenverarbeitungs-Vorraussetzungen
    Das ist gewissermassen ein ganzer Ausbildungs-Plan. Jemand mit Kinderschuhen wird da gerne ein halbes Jahr mit zubringen, bis er das drauf hat.
    (Allerdings es gibt auch Überflieger, die lesen das kurz durch, und können loslegen)
    Aber was nützt es?
    Was man nicht lernt, das kann man nicht, und wenn mans nicht kann, dann gehts nicht.
    Hallo Danke für den Link ich werde ihn mir dann genau ansehen.

    Na ja ich habe schon sehr viel mit Access und Relationalen Datenbanken gearbeitet aber halt auf VBA programmiert und jetzt möchte ich halt in VB.net weiter arbeiten und da bin ich halt noch am
    Anfang das sollte es eigentlich bedeuten mit den Kinderschuhen.
    Kenn mich halt noch nicht aus welche Klassen es überhaupt in Vb.Net gibt und welche für Hauptsächlich für mich Datenverarbeitung die neuesten bzw. besten sind die man benutzen sollte.
    VBA hat ja seit langen keine Updates mehr gemacht und ist halt da schon recht altmodisch unterwegs...