我正在尝试将多行插入Access数据库。该表名为sales
,其列为sandwich
和price
。我试图插入的数据包含在多个TextBox
控件中。
到目前为止,我已尝试过此代码:
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
工作正常。程序只检查完整的TextBox
控件并插入正确的行数,但是当我检查数据库的值完全相同时,反复插入最后TextBox
的值。
任何想法如何解决这个问题?
答案 0 :(得分:1)
您应该在For Each
循环外添加参数 并更新每个循环的值。取消.AddWithValue
并使用.Add
。 .AddWithValue
必须推断查询参数的数据库类型。
您还应该考虑使用grpbill.Controls.OfType(Of TextBox)()
代替grpbill.Controls
,因为这样可以确保您只浏览TextBox
控件集合而不包含Label
或{{1} }或GroupBox
等。
请注意,我有以下LINQ语句:
Panel
有了这个,您现在可以删除From t In grpbill.OfType(Of TextBox)()
Where t.TextLength > 0
Order By t.TabIndex
声明。另外,请务必为每个If
设置TabIndex
,以便按正确的顺序将它们添加到数据库中。
我还删除了TextBox
以缩短代码。您可以使用逗号代替。这只是个人偏好。
最后,您不需要Using
,因为conn.Close()
将为您处理所有这些。
代码:
Using
答案 1 :(得分:0)
我认为你没有宣布和设定价值。
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