Vb.net 靠近'的语法不正确;4';

Vb.net 靠近'的语法不正确;4';,vb.net,syntax,insert,Vb.net,Syntax,Insert,我有一个插入代码,其中变量s=4。非常感谢您的帮助 con.Open() Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text

我有一个插入代码,其中变量s=4。非常感谢您的帮助

 con.Open()
            Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "'", con)
            Dim cmd1 As New SqlCommand("INSERT INTO Depndent VALUES('" & txtessn.Text & "','" & txtdepname.Text & "','" & cmbdsex.Text.ToUpper & "','" & txtdbdate.Text & "','" & txtrelationship.Text & "'", con)

            cmd.ExecuteNonQuery()
            cmd1.ExecuteNonQuery()


            cleartxt()
            con.Close()

你忘记了结束语了。)

…l.Value&“,”&s&“,con)


你忘记了结束语了。)

…l.Value&“,”&s&“,con)


错误使用闭合括号


错误使用闭合括号


你错过了结尾的括号。像这样改变它

Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "')", con)

你错过了结尾的括号。像这样改变它

Dim cmd As New SqlCommand("INSERT INTO Employee VALUES('" & txtfname.Text & "','" & txtmi.Text & "','" & txtlname.Text & "','" & txtssn.Text & "','" & txtbdate.Text & "','" & txtaddress.Text & "','" & cmbsex.Text.ToUpper & "','" & txtsalary.Text & "','" & DBNull.Value & "','" & s & "')", con)

缺少结束参数是您遇到的较小问题之一:

  • 它很难阅读和维护
  • 它对公众开放
  • 它假设代码知道DB层向列提供服务的顺序
  • 似乎没有一次性物品正在被处理
  • 不需要的数据类型转换似乎正在进行
  • 为处理1、2和3的长查询创建SQL的更好方法如下:

    ' an XML literal
    Dim SQL = <sql>
            INSERT INTO Employee 
               (FirstName, LastName, SocSecNum, BirthDate,
                 Address, Gender
                 ...) 
            VALUES 
                (@firstN, @lastN, @SSN ... )
            </sql>
    
    Using cmd As New SqlCommand(sql.Value, con)
           ...
        cmd.Parameters.AddWithValue("@firstN", txtfname.Text)
        cmd.Parameters.AddWithValue("@lastN", txtlname.Text)
        ...
        cmd.ExecuteNonQuery()
        ...
    End Using     ' disposes of the object when done
    
    无论使用哪种方法,OP中缺失的帕伦都会更加明显,根本不太可能发生。接下来,有些列似乎是数字的,例如Salary和BirthDate,这样的SQL可能是错误的:

    ... & "','" & txtbdate.Text & "','" & txtsalary.Text & "','" ...
    
    在值周围放置记号可确保将字符串传递给dbLayer。若Salary是一个数字列,DateOfBirth是一个日期列——这是应该的——那个么您很可能会得到一个数据类型不匹配错误。参数使传递正确的数据类型变得更容易,因为您可以看到正在使用的内容:

      cmd.Parameters.AddWithValue("@DOB", CDate(txtbdate.Text))
      cmd.Parameters.AddWithValue("@Salary", CDec(txtsalary.Text))
    
    (注意,当使用OleDB时,参数只是顺序的,因此确保
    AddWithValue
    的顺序与SQL中指定的顺序相同)。传递错误的数据类型可能会导致dblayer做出一些假设,为了避免这种情况,您可以长期这样做:

    cmd.Parameters.Add("@firstN", SqlDbType.VarChar, 32)        ' 32 = column def
    cmd.Parameters("@firstN").Value = txtfname.Text
    

    还有一个问题是,代码似乎没有执行任何数据验证。如果他们键入“我喜欢馅饼”作为薪水怎么办?或者输入“02/31/1986”(mm/dd)作为生日?您的代码将深入此过程。因此,在用户输入上使用诸如
    DateTime.TryParse
    Integer.TryParse
    之类的东西进行数据验证应该(并且可能已经)在更远的上游进行。

    缺少关闭参数是您遇到的较小问题之一:

  • 它很难阅读和维护
  • 它对公众开放
  • 它假设代码知道DB层向列提供服务的顺序
  • 似乎没有一次性物品正在被处理
  • 不需要的数据类型转换似乎正在进行
  • 为处理1、2和3的长查询创建SQL的更好方法如下:

    ' an XML literal
    Dim SQL = <sql>
            INSERT INTO Employee 
               (FirstName, LastName, SocSecNum, BirthDate,
                 Address, Gender
                 ...) 
            VALUES 
                (@firstN, @lastN, @SSN ... )
            </sql>
    
    Using cmd As New SqlCommand(sql.Value, con)
           ...
        cmd.Parameters.AddWithValue("@firstN", txtfname.Text)
        cmd.Parameters.AddWithValue("@lastN", txtlname.Text)
        ...
        cmd.ExecuteNonQuery()
        ...
    End Using     ' disposes of the object when done
    
    无论使用哪种方法,OP中缺失的帕伦都会更加明显,根本不太可能发生。接下来,有些列似乎是数字的,例如Salary和BirthDate,这样的SQL可能是错误的:

    ... & "','" & txtbdate.Text & "','" & txtsalary.Text & "','" ...
    
    在值周围放置记号可确保将字符串传递给dbLayer。若Salary是一个数字列,DateOfBirth是一个日期列——这是应该的——那个么您很可能会得到一个数据类型不匹配错误。参数使传递正确的数据类型变得更容易,因为您可以看到正在使用的内容:

      cmd.Parameters.AddWithValue("@DOB", CDate(txtbdate.Text))
      cmd.Parameters.AddWithValue("@Salary", CDec(txtsalary.Text))
    
    (注意,当使用OleDB时,参数只是顺序的,因此确保
    AddWithValue
    的顺序与SQL中指定的顺序相同)。传递错误的数据类型可能会导致dblayer做出一些假设,为了避免这种情况,您可以长期这样做:

    cmd.Parameters.Add("@firstN", SqlDbType.VarChar, 32)        ' 32 = column def
    cmd.Parameters("@firstN").Value = txtfname.Text
    

    还有一个问题是,代码似乎没有执行任何数据验证。如果他们键入“我喜欢馅饼”作为薪水怎么办?或者输入“02/31/1986”(mm/dd)作为生日?您的代码将深入此过程。因此,在用户输入上使用诸如
    DateTime.TryParse
    Integer.TryParse
    之类的东西进行的数据验证应该(并且可能已经)在更远的上游进行。

    在s&“')另一个问题,将这两个插入命令与更新命令放在一起可以吗?在s&“')之后缺少闭合括号)另一个问题,将这两个插入命令与更新命令放在一起可以吗?