语法问题,代码在我项目的不同区域工作正常。 VB.NET
Posted
技术标签:
【中文标题】语法问题,代码在我项目的不同区域工作正常。 VB.NET【英文标题】:Problem with syntax, code works fine in a different area of my project. VB.NET 【发布时间】:2021-08-01 14:23:10 【问题描述】:因此,我尝试使用“保存”按钮更新数据库和 datagridview,我在程序的前面部分使用了此代码的一部分用于另一个功能,但在这里它给了我一个语法错误。谁能告诉我在哪里?我不明白它在哪里。
这部分代码在我添加员工时有效。
Private Sub AddEmployee_Click(sender As Object, e As EventArgs) Handles AddEmployee.Click
Dim Msg, Style, Title, Response, mystring
Msg = "Do you want to add employee ?"
Style = vbYesNo + vbCritical + vbDefaultButton2
Title = "MsgBox Demonstration"
' Display message.
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
TableAdapterManager.UpdateAll(Database13DataSet)
con.Open()
cmd.CommandType = System.Data.CommandType.Text
cmd.CommandText = "Insert INTO dbo.employees (EmpID, LastName, FirstName, AddressHalf, SSN, VehNumb, Certification) values ('" + EmpID.Text + "' , '" + LastName1.Text + "', '" + FirstName1.Text + "', '" + AddyHalf1.Text + "', '" + SocialNum.Text + "', '" + VehNumb.Text + "', '" + Certification1.Text + "')"
cmd.Connection = con
cmd.ExecuteNonQuery()
MessageBox.Show("Employee Added")
Else
mystring = True
MessageBox.Show("Cancelled")
End If
con.Close()
这部分代码是不起作用的部分。我认为这与我尝试更新表格的编码有关,但我无法弄清楚。
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
Dim Msg, Style, Title, Response, mystring
Msg = "Do you want to update employee ?"
Style = vbYesNo + vbCritical + vbDefaultButton2
Title = "MsgBox Demonstration"
' Display message.
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
TableAdapterManager.UpdateAll(Database13DataSet)
con.Open()
cmd.CommandType = System.Data.CommandType.Text
cmd.CommandText = "Update employees SET (EmpID, LastName, FirstName, AddressHalf, SSN, VehNumb, Certification) Where ( ModEmpID.Text , ModLastName.Text , ModFirstName.Text, ModAddy.Text , ModSSN.Text , ModVehNum.Text , ModCerts.Text )"
cmd.Connection = con
cmd.ExecuteNonQuery()
MessageBox.Show("Employee Added")
con.Close()
Else
mystring = True
MessageBox.Show("Cancelled")
End If
con.Close()
End Sub
Public Sub Updating()
Me.EmployeesTableAdapter.Fill(Me.Database13DataSet.Employees)
End Sub
End Class
【问题讨论】:
insert into (columns) values (data)
是一个实际的 SQL 语法。 update set (columns) where (data)
不是 SQL 语法,它是您发明的。因此,您不能争辩说同样的事情也适用于您项目的其他部分。请参考UPDATE
声明的actual syntax,但在此之前请参阅***.com/q/332365/11683。
除了@GSerg 所说的之外,您会发现构建sql 语句的字符串连接可能非常不可靠,有时很难调试。学习使用参数
@CaiusJard,非常正确。现在养成了每次我看到一个 SQL 命令字符串寻找连接而不看其他任何东西的习惯,这对我来说很糟糕
@Hursey 就在你身边;实际上我看了一眼代码,一定是挑出了“更新员工”?在一个字符串中(在 msgbox 问题常量中),我就像“是的!哇哦,一个他们使用参数的 VB 问题,我不必提供 bobby 表讲座!”然后我意识到..
@Gserg,您的 *** 没有帮助。我对此很陌生。但是谢谢你让我更加困惑。
【参考方案1】:
If Response = vbYes Then TableAdapterManager.UpdateAll(Database13DataSet) con.Open() cmd.CommandType = System.Data.CommandType.Text cmd.CommandText = "Insert INTO dbo.employees (EmpID, LastName, FirstName, AddressHalf, SSN, VehNumb, Certification) values ('" + EmpID.Text + "' , '" + LastName1.Text + "', '" + FirstName1.Text + "','" + AddyHalf1.Text + "', '" + SocialNum.Text + "', '" + VehNumb.Text + "', '" + Certification1.Text + "')" cmd.Connection = con cmd.ExecuteNonQuery() MessageBox.Show("Employee Added") Else
不。
它不是那样工作的;它是专门不那样工作的
您有表格适配器;在任何的你的代码中根本不应该有"INSERT INTO..
或"UPDATE ..
、select、delete或任何其他类型的SQL
让我们快速回到基础
在某些时候,您已经遵循了一些教程,这些教程可能让您做了一些导致 XyzDataSet.xsd 文件出现在您的项目中的操作。里面有数据表和表适配器,整个东西看起来有点像数据库。
它是数据库的本地表示;表适配器将数据从数据库下载到数据集的数据表中;您操作数据/显示用户/更改它/添加到它/从中删除.. ..完成后,您调用 tableadapter 将其推回数据库。
TableAdapter 知道如何执行您在代码中添加的所有内容;您可以打开 XyzDataSet.Designer.vb 文件并查看它;它有数千行代码用于拉取和推送数据库
如果您认为“我实际上没有工具...下载所有名为 smith 的员工”,那么您将转到您的数据集,找到员工表适配器,然后右键单击它并你添加查询..SELECT * FROM employees WHERE name like @name
,你称之为 FillByName,你完成了向导,突然间你的employeeTableAdapter
有了一个名为 FillByName 的新方法,它接受一个数据表和一个字符串名称。你把它叫做eta.FillByName(myXyzDataset.Employees, "Smith")
- 它为你做了所有的数据库位,命令,参数,连接..
您想添加一名新员工;再次简单,tableadapter 会保存它,你只需要将新的 emp 放入本地数据表中:
Dim emp = myXyzDataSet.Employees.NewEmployeeRow()
emp.Name = "John Smith"
emp.Age = 23
...
myXyzDataSet.Employees.AddEmployeeRow(emp)
如果你知道所有的值,就有一个捷径:
myXyzDataSet.Employees.AddEmployeeRow("John Smith", 23, ...)
无论哪种方式,您的本地数据缓存数据表现在都包含需要保存的新记录。这样就完成了:
employeeTableAdapter.Update(myXyzDataSet.Employees)
TA 将查看该行并查看它最近被添加。它会运行它内置的 INSERT 命令——你不需要这样做
如果您编辑了一行:
Dim r = myXyzDataSet.Employees(0) 'first one.. or maybe you'll loop and find John Smith, or use the Find method..
r.Name = "Joe Smith"
然后该行知道它已被更改。 tableadapter 也会知道它,当您调用 Update 时(将其想象为 Save,它不仅仅是用于 SQL UPDATE),它将触发内置的 UPDATE 命令并将名称更改保存回 DB。
DELETE 的情况类似。
TableAdapter 是拉取和推送数据的设备。如果您想将自定义 SQL 添加到您的应用程序,请将它们添加到 TA 并调用方法。不要直接使用 db 命令填充代码
【讨论】:
也许我没有澄清最好的。我“假程序员”不会在数据库中添加、删除或修改任何内容。用户会。所以我在项目中添加任何代码并不是我想要做的。我只是在学习所有这些,这非常令人困惑。 我已经很好地添加了它们并且我的代码可以正常工作。它正在修改它们,我无法开始工作。它不更新数据库。正如我所看到的那样,我不知道如何使用表格适配器。 我也很困惑,因为我的代码的第一部分工作正常,但你说它不打算那样工作。它工作正常,并在 datagridview 和数据库中添加了一名员工......【参考方案2】:一个小时后我终于弄明白了……
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
Dim Msg, Style, Title, Response, mystring
Msg = "Do you want to update employee ?"
Style = vbYesNo + vbCritical + vbDefaultButton2
Title = "MsgBox Demonstration"
' Display message.
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
DataGridView1.CurrentRow.Cells(0).Value = Me.ModEmpID.Text
DataGridView1.CurrentRow.Cells(1).Value = Me.ModLastName.Text
DataGridView1.CurrentRow.Cells(2).Value = Me.ModFirstName.Text
DataGridView1.CurrentRow.Cells(3).Value = Me.ModAddy.Text
DataGridView1.CurrentRow.Cells(4).Value = Me.ModSSN.Text
DataGridView1.CurrentRow.Cells(5).Value = Me.ModVehNum.Text
DataGridView1.CurrentRow.Cells(6).Value = Me.ModCerts.Text
For i As Integer = 0 To DataGridView1.Rows.Count - 1
Dim cmd4 As New SqlCommand("", con)
cmd4.CommandText = "update Employees set LastName ='" & DataGridView1.Rows(i).Cells(1).Value & "' , FirstName= '" & DataGridView1.Rows(i).Cells(2).Value & "' , AddressHalf = '" & DataGridView1.Rows(i).Cells(3).Value & "' , SSN = '" & DataGridView1.Rows(i).Cells(4).Value & "' , VehNumb = '" & DataGridView1.Rows(i).Cells(5).Value & "' , Certification = '" & DataGridView1.Rows(i).Cells(6).Value & "'Where EmpID = '" & DataGridView1.Rows(i).Cells(0).Value & "' "
con.Open()
cmd4.ExecuteNonQuery()
con.Close()
Next
MessageBox.Show("Employee Updated")
Else
mystring = True
MessageBox.Show("Cancelled")
End If
con.Close()
End Sub
【讨论】:
以上是关于语法问题,代码在我项目的不同区域工作正常。 VB.NET的主要内容,如果未能解决你的问题,请参考以下文章