Benutzer mit den meisten Antworten
Parameter x hat keine Standardwert

Frage
-
Hallo Experten,
ich lese eine txt/csv Datei ein und möchte diese dann nach der Bearbeitung in einem Rutsch in eine Access-DB (2013) schreiben.
Hier erstmal der Code (danach die Erklärung)
Dim QuellDatei As String Dim dgvQuelleData As DataTable Dim dgvQuelleDataView As DataView Dim dgvQuelleErgData As DataTable Dim dgvQuelleErgDataView As DataView Private Sub cmdQuelleRegelDoIt_Click() Handles cmdQuelleRegelDoIt.Click Dim xsql(10) As String Dim xxsql() As String Dim xxxsql() As String dgvQuelleErgData = Funktionen.CSV_as_Table(QuellDatei) dgvQuelleErgDataView = New DataView(dgvQuelleErgData) 'Leere Spalten entfernen If cbQuelleKillEmptyCols.Checked = True Then For i As Integer = dgvQuelle.ColumnCount - 1 To 0 Step -1 Debug.Print(dgvQuelle.Columns(i).HeaderText) dgvQuelleDataView.RowFilter = dgvQuelle.Columns(i).HeaderText & "<>''" Debug.Print(dgvQuelleDataView.Count) If dgvQuelleDataView.Count = 0 Then dgvQuelleErgData.Columns.RemoveAt(i) Next End If dgvQuelleErgebnis.DataSource = dgvQuelleErgDataView 'Erste Zeile enthält Spaltenname If cbQuelleZeileFeldnamen.Checked = True Then For i As Integer = 0 To dgvQuelleErgebnis.Columns.Count - 1 dgvQuelleErgebnis.Columns(i).HeaderText = dgvQuelleErgebnis.Item(i, 0).Value.ToString If xsql(0) <> "" Then xsql(0) += "," xsql(0) += " '' as [" & dgvQuelleErgebnis.Columns(i).HeaderText.ToString.Replace(".", "").Trim & "]" If xsql(1) <> "" Then xsql(1) += "," xsql(1) += "[" & dgvQuelleErgebnis.Columns(i).HeaderText.ToString.Replace(".", "").Trim & "]" If xsql(2) <> "" Then xsql(2) += "," xsql(2) += "@wert" & i.ToString.Trim Next dgvQuelleErgDataView.Delete(0) dgvQuelleErgData.Rows.RemoveAt(dgvQuelleErgData.Rows.Count - 1) End If Dim DS = New System.Data.DataSet DS.Tables.Add(dgvQuelleErgData) 'Tabelle temp_import löschen DBFunktion.SetWerttoDaten("Drop Table Temp_Import", My.Settings.IWVSchnittstellenConnectionString) 'Tabelle temp_import erstellen xsql(0) = "SELECT " & xsql(0) & " INTO Temp_Import" DBFunktion.SetWerttoDaten(xsql(0), My.Settings.IWVSchnittstellenConnectionString) 'Datasätze temp_import löschen DBFunktion.SetWerttoDaten("delete * from Temp_Import", My.Settings.IWVSchnittstellenConnectionString) Dim conn As New OleDbConnection conn.ConnectionString = My.Settings.IWVSchnittstellenConnectionString Dim SqlSelect As String = "SELECT " & xsql(1) & " FROM Temp_Import" Dim da As New OleDbDataAdapter(SqlSelect, conn) da.MissingSchemaAction = MissingSchemaAction.AddWithKey ' SQL Insert-Befehl erstellen mit @-Platzhaltern da.InsertCommand = New OleDbCommand("INSERT INTO Temp_Import (" & xsql(1) & ") VALUES (" & xsql(2) & ")") ' @-Parameter erstellen (Parametername, Typ, Länge, DataTable-Spalte xxsql = xsql(2).Split(",") xxxsql = xsql(1).Split(",") For i As Integer = 0 To xxsql.Count - 1 da.InsertCommand.Parameters.Add(xxsql(i), OleDbType.WChar, 255, xxxsql(i)) Next
da.InsertCommand.Connection = conn ' Open und Close macht DataAdapter automatisch Try da.Update(DS.Tables("Table1")) Catch ex As Exception MsgBox(ex.Message) End Try End Sub
Das insert-Command sieht so aus:
INSERT INTO Temp_Import ([PBer],[Anrede],[Name],[PersNr],[Firma],[Vers-Nr],[Soll],[Vers-summe],[Versicherer],[Versicherungsart],[Geb-Datum],[Eintritt],[Austritt],[Mitarbeiterkreis]) VALUES (@wert0,@wert1,@wert2,@wert3,@wert4,@wert5,@wert6,@wert7,@wert8,@wert9,@wert10,@wert11,@wert12,@wert13)
Der Fehler entsteht am Ende bei: da.Update(DS.Tables("Table1")) -> Meldung: Parameter @wert0 hat keine Standardwert
Im Dataset("Table1") sind 6400 Datensätze alle Felder haben einen Wert.
Hat jemand eine IDEE ... danke monarch
Antworten
-
Hallo Experten
bin selbst auf die Lösung gekommen, da war eines nicht richtig: der folgende Code funzt aber jetzt einwandfrei:
Private Sub cmdQuelleRegelDoIt_Click() Handles cmdQuelleRegelDoIt.Click Dim xsql(10) As String QuelleErgData = Funktionen.CSV_as_Table(QuellDatei) QuelleErgDataView = New DataView(QuelleErgData) 'Leere Spalten entfernen If cbQuelleKillEmptyCols.Checked = True Then For i As Integer = QuelleErgData.Columns.Count - 1 To 0 Step -1 QuelleErgDataView.RowFilter = QuelleErgData.Columns.Item(i).ColumnName & "<>''" If QuelleErgDataView.Count = 0 Then QuelleErgData.Columns.RemoveAt(i) Next End If 'Erste Zeile enthält Spaltenname If cbQuelleZeileFeldnamen.Checked = True Then For i As Integer = 0 To QuelleErgData.Columns.Count - 1 QuelleErgData.Columns.Item(i).ColumnName = QuelleErgDataView.Item(0).Row.ItemArray(i).ToString.Replace(".", "").Trim Next QuelleErgData.Rows.RemoveAt(0) End If 'Das Resultat in einem datagrid anzeigen dgvQuelleErgebnis.DataSource = QuelleErgDataView 'Tabelle in DB erzeugen For i As Integer = 0 To QuelleErgData.Columns.Count - 1 If xsql(0) <> "" Then xsql(0) += "," xsql(0) += "[" & QuelleErgData.Columns.Item(i).ColumnName & "] varchar(255)" Next 'Tabelle temp_import löschen falls vorhanden DBFunktion.SetWerttoDaten("Drop Table Temp_Import", My.Settings.IWVSchnittstellenConnectionString) 'Tabelle temp_import erstellen xsql(0) = "Create Table Temp_Import (SID AUTOINCREMENT PRIMARY KEY," & xsql(0) & ")" DBFunktion.SetWerttoDaten(xsql(0), My.Settings.IWVSchnittstellenConnectionString) Dim conn As New OleDbConnection conn.ConnectionString = My.Settings.IWVSchnittstellenConnectionString Dim DS = New DataSet DS.Tables.Add(QuelleErgData) Dim da As New OleDbDataAdapter("Select * from Temp_Import", My.Settings.IWVSchnittstellenConnectionString) Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(da) builder.QuotePrefix = "[" builder.QuoteSuffix = "]" da.Update(DS.Tables("Table1")) End Sub
mfg monarch- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 11. September 2015 13:20
Alle Antworten
-
Hallo Experten
bin selbst auf die Lösung gekommen, da war eines nicht richtig: der folgende Code funzt aber jetzt einwandfrei:
Private Sub cmdQuelleRegelDoIt_Click() Handles cmdQuelleRegelDoIt.Click Dim xsql(10) As String QuelleErgData = Funktionen.CSV_as_Table(QuellDatei) QuelleErgDataView = New DataView(QuelleErgData) 'Leere Spalten entfernen If cbQuelleKillEmptyCols.Checked = True Then For i As Integer = QuelleErgData.Columns.Count - 1 To 0 Step -1 QuelleErgDataView.RowFilter = QuelleErgData.Columns.Item(i).ColumnName & "<>''" If QuelleErgDataView.Count = 0 Then QuelleErgData.Columns.RemoveAt(i) Next End If 'Erste Zeile enthält Spaltenname If cbQuelleZeileFeldnamen.Checked = True Then For i As Integer = 0 To QuelleErgData.Columns.Count - 1 QuelleErgData.Columns.Item(i).ColumnName = QuelleErgDataView.Item(0).Row.ItemArray(i).ToString.Replace(".", "").Trim Next QuelleErgData.Rows.RemoveAt(0) End If 'Das Resultat in einem datagrid anzeigen dgvQuelleErgebnis.DataSource = QuelleErgDataView 'Tabelle in DB erzeugen For i As Integer = 0 To QuelleErgData.Columns.Count - 1 If xsql(0) <> "" Then xsql(0) += "," xsql(0) += "[" & QuelleErgData.Columns.Item(i).ColumnName & "] varchar(255)" Next 'Tabelle temp_import löschen falls vorhanden DBFunktion.SetWerttoDaten("Drop Table Temp_Import", My.Settings.IWVSchnittstellenConnectionString) 'Tabelle temp_import erstellen xsql(0) = "Create Table Temp_Import (SID AUTOINCREMENT PRIMARY KEY," & xsql(0) & ")" DBFunktion.SetWerttoDaten(xsql(0), My.Settings.IWVSchnittstellenConnectionString) Dim conn As New OleDbConnection conn.ConnectionString = My.Settings.IWVSchnittstellenConnectionString Dim DS = New DataSet DS.Tables.Add(QuelleErgData) Dim da As New OleDbDataAdapter("Select * from Temp_Import", My.Settings.IWVSchnittstellenConnectionString) Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(da) builder.QuotePrefix = "[" builder.QuoteSuffix = "]" da.Update(DS.Tables("Table1")) End Sub
mfg monarch- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 11. September 2015 13:20