none
Parameter x hat keine Standardwert RRS feed

  • 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 

    Mittwoch, 9. September 2015 15:04

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

    Donnerstag, 10. September 2015 08:42

Alle Antworten

  • Hi,

    welchen Provider nutzt du?

    Microsoft.Jet.OLEDB.4.0 oder
    Microsoft.ACE.OLEDB.12.0

    Beide funktionieren bei Access jedoch erlaubt der 4.0 keine "@wert" sondern nur "?".

    Mittwoch, 9. September 2015 15:57
  • 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

    Donnerstag, 10. September 2015 08:42