我有一个VB.Net表单,该表单允许用户更新客户详细信息,例如姓名,联系电话:等。因此,当客户输入客户名称等的新名称时,应用程序应更新现有的相应字段与客户ID相关的条目。
Dim cn As New SqlConnection
Dim cmd As New SqlCommand
Dim adapter As New SqlDataAdapter
Dim dt As New DataTable
cn.ConnectionString = ("Data Source=NIMO-HP\SQLEXPRESS;Initial Catalog=FYP_db;Integrated Security=True")
cmd.Connection = cn
cn.Open()
cmd.CommandText = " UPDATE TblCustomerDetails (compID, compName, compContact, compAddress, compFax, compEmail, compPayterm, compTaxscheme, compPaymode, compRemarks ) SET Values ('" & lblCID.Text & "', '" & txtCname.Text & "', '" & txtCpno.Text & "', '" & txtCaddrs.Text & "','" & txtCfax.Text & "', '" & txtCemail.Text & "', '" & cmbPterm.Text & "','" & cmbTaxschm.Text & "',' " & cmbPmode.Text & "', '" & txtRemarks.Text & "') WHERE compID = '" & lblCID.Text & "';"
cmd.ExecuteNonQuery()
MsgBox("Account updated!!", MsgBoxStyle.Information, "Updation complete")
您对UPDATE语句使用INSERT语法。您的UPDATE语句应采用以下形式:
UPDATE tableName
SET col1 = val1,
col2 = val2,
col3 = val3
WHERE someColumn = someValue
此外,通过使用非参数化查询,您很容易受到SQL Injection攻击的影响。最后,我将使用一个Using
块来确保正确关闭和处置您的连接和命令。
将所有内容放在一起看起来像这样:
Using Dim cn As SqlConnection = New SqlConnection("Data Source=NIMO-HP\SQLEXPRESS;Initial Catalog=FYP_db;Integrated Security=True")
cn.Open()
Dim sqlQuery As String = "UPDATE TblCustomerDetails " + _
"SET compName = @compName, " + _
"compContact = @compContact, " + _
"compAddress = @compAddress, " + _
"compFax = @compFax, " + _
"compEmail = @compEmail, " + _
"compPayterm = @compPayterm, " + _
"compTaxscheme = @compTaxscheme, " + _
"compPaymode = @compPaymode, " + _
"compRemarks = @compRemarks " + _
"WHERE compID = @compID"
Using Dim cmd As SqlCommand = New SqlCommand(sqlQuery, cn)
cmd.Parameters.AddWithValue("@compFax", txtCname.Text)
cmd.Parameters.AddWithValue("@compContact", txtCpno.Text)
cmd.Parameters.AddWithValue("@compAddress", txtCaddrs.Text)
cmd.Parameters.AddWithValue("@compFax", txtCfax.Text)
cmd.Parameters.AddWithValue("@compEmail", txtCemail.Text)
cmd.Parameters.AddWithValue("@compPayterm", cmbPTerm.Text)
cmd.Parameters.AddWithValue("@compTaxscheme", cmbTaxschm.Text)
cmd.Parameters.AddWithValue("@compPaymode", cmbPmode.Text)
cmd.Parameters.AddWithValue("@compRemarks", txtRemarks.Text)
cmd.Parameters.AddWithValue("@compID", lblCID.Text)
Dim result As Integer
result = cmd.ExecuteNonQuery()
If result = 1 Then
MsgBox("Account updated!!", MsgBoxStyle.Information, _
"Updation complete")
Else
MsgBox("Account not updated!!", MsgBoxStyle.Information, _
"Updation not complete")
End If
End Using
End Using
上面的代码示例中还有一些其他注意事项:
首先,我从要更新的值列表中删除了compID。您在WHERE查询中使用了该列,因此,如果您尝试更新WHERE子句中使用的同一列,那么我认为在查询中会有有趣的结果。此外,该值的来源是Label,它告诉我不应更改。
其次,ExecuteNonQuery()
返回一个int,其中包含受影响的行数。在这种情况下,它应该为1-如果不是1,请显示一个不同的消息框。
第三,cmbPTerm
,cmbTaxxshm
和cmbPmode
听起来像ComboBox
我,你就不会得到什么,我认为你正在使用他们的期望Text
属性。我想您会想要SelectedText
-不知道您的ComboBox是如何绑定的就很难说。我将其留给您练习:)
第四,出于可读性考虑,我将UPDATE查询分为几行-只要查询正确,就不必这样做。
最后,我建议使用MessagBox.Show()
VS MsgBox
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句