2017-03-20 5 views
1

Ich versuche, mehrere Zeilen in eine Access-Datenbank einzufügen. Die Tabelle heißt sales mit den Spalten sandwich und price. Die Daten, die ich einfügen möchte, sind in mehreren Steuerelementen TextBox enthalten.Wie fügt man mehrere Zeilen in eine Access-Datenbank ein?

Bisher habe ich diesen Code versucht:

Dim sql As String = "INSERT INTO [sales] ([sandwich]) VALUES ([@sandwich])" 
Try 
    Using conn As New OleDbConnection(constring) 
     Using cmd As New OleDbCommand(sql, conn) 
      conn.Open() 
      For Each Order As TextBox In grpbill.Controls 
       If Order.Text.Length > 0 Then 
        cmd.Parameters.AddWithValue("@sandwich", Order.Text) 
        cmd.ExecuteNonQuery() 
       End If 
      Next Order 
     End Using 
     conn.Close() 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

Es funktioniert gut. Das Programm prüft nur auf volle TextBox Steuerelemente und fügt die richtige Anzahl von Zeilen ein, aber wenn ich die Datenbank überprüfe, sind die Werte alle gleich, wobei der Wert des letzten TextBox immer wieder eingefügt wird.

Irgendwelche Ideen, wie das zu beheben?

+0

Ich bezweifle es richtig gar mit mehr als einem textBox im grpbox arbeitet - man kann nicht AddWithValue immer und immer wieder - wenn es drei Elemente sind, wird es versuchen, 3 Parameter hinzuzufügen, mit der Derselbe Name, der natürlich ausfallen wird. – Plutonix

+0

Zuerst würde ich 'grpbill.Controls' zu' grpbill.Controls.OfType (Of TextBox)() 'ändern. Auf diese Weise wissen Sie, dass Sie sich immer nur mit einer TextBox beschäftigen werden. Und Sie sollten überlegen, Ihren Parameter vor dem 'For 'hinzuzufügen und dann den Wert in jeder Schleife zu aktualisieren. – Bugs

+0

@Plutonix Wie ich am Ende meiner Frage gesagt habe, gibt das Programm immer wieder denselben Wert ein. Ich würde nicht fragen, ob nichts falsch war: S –

Antwort

1

Sie sollten den Parameter außerhalb die For Each Schleife hinzufügen und den Wert auf jeder Schleife aktualisieren. Entfernen Sie .AddWithValue und verwenden Sie .Add. .AddWithValue muss den Datenbanktyp für Ihren Abfrageparameter ableiten.

Sie sollten auch mit grpbill.Controls.OfType(Of TextBox)() statt grpbill.Controls betrachten, da dies nur eine Schleife durch die Sammlung TextBox Kontrolle stellt sicher, und kein Label oder GroupBox oder ein Panel usw.

Hinweis enthalten, dass ich die folgende LINQ-Anweisung haben:

From t In grpbill.OfType(Of TextBox)() 
Where t.TextLength > 0 
Order By t.TabIndex 

Mit diesem können Sie jetzt Ihre If Aussage entfernen. Stellen Sie außerdem sicher, dass die TabIndex für jede TextBox so eingestellt ist, dass sie in der richtigen Reihenfolge zur Datenbank hinzugefügt werden.

Ich habe auch eine Using entfernt, um den Code ein wenig zu verkürzen. Sie können stattdessen ein Komma verwenden. Dies ist nur persönliche Vorliebe.

Schließlich brauchen Sie nicht conn.Close() als Using wird alles für Sie behandeln.

Code:

Dim sql As String = "INSERT INTO [sales] ([sandwich]) VALUES ([@sandwich])" 
Try 
    Using conn As New OleDbConnection(constring), 
      cmd As New OleDbCommand(sql, conn) 
     conn.Open() 
     cmd.Parameters.Add("@sandwich", OleDbType.VarChar) 
     For Each Order As TextBox In From t In grpbill.OfType(Of TextBox)() 
            Where t.TextLength > 0 
            Order By t.TabIndex 
       cmd.Parameters("@sandwich").Value = Order.Text 
       cmd.ExecuteNonQuery() 
     Next 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
0

Ich glaube nicht, erklären Sie, und Werte einstellen.

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim Name As String = txtName.Text 
    Dim Email As String = tbxEmail.Text 
    Dim Comment As String = tbxComment.Text 

    Using dbConn = New OleDbConnection(".......") 
     dbConn.Open() 
     Dim strSql = "INSERT INTO [user] (username, email, comments) VALUES (?,?,?)" 
     Using objcmd = New OleDbCommand(strSql, dbConn) 
      objcmd.Parameters.AddWithValue("@username", Name) 
      objcmd.Parameters.AddWithValue("@email", Email) 
      objcmd.Parameters.AddWithValue("@comments", Comment) 
      objcmd.ExecuteNonQuery() 
     End Using 
    End Using 
    Response.Write("Submitted Successfully") 
End Sub 

Insert text from a text box into and Access 2010 DataBase using VB.Net

Verwandte Themen