语法问题,代码在我项目的不同区域工作正常。 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的主要内容,如果未能解决你的问题,请参考以下文章

项目发布后无法正常工作。 VB.NET

在 VB.net 中询问我的语法

setlocale在我的时区中无法正常工作

将 VB.NET 项目移动到新计算机后日期无法正常工作[关闭]

C++ 库在 vb6 中有效,但在 c# 中无效

从 VB.Net DLL 引用 DLL