' 4'附近的语法不正确

时间:2014-10-08 12:16:13

标签: vb.net syntax insert

我有一个INSERT代码,其中变量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()

4 个答案:

答案 0 :(得分:2)

您忘记了结束

  

...... l.Value& "''" &安培; s& "' ",con)

答案 1 :(得分:2)

缺少的关闭问题是你所拥有的一个较小的问题:

  1. 难以阅读和维护
  2. SQL injection attacks
  3. 是开放的
  4. 假设代码知道数据库层将提供列的顺序
  5. 不会出现一次性用品
  6. 似乎正在进行不需要的数据类型转换
  7. 为地址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
    

    即使INSERT INTO tablename VALUES ...是合法语法,它也会假定您的数据库具有某个顺序的列,并且在更改数据库时它不会更改。上述方法根据列和参数占位符的顺序将参数显式映射到列。名称(&#34; @ firstN&#34;)使您可以轻松查看您正在使用的值。

    使用XML文本将允许您布置文本,但它对您来说最易读,但即使是字符串文字也比连接更容易阅读和维护:

    Dim strSQL As String = "INSERT INTO Employee (FirstName, LastName, SocSecNum, " _
                 & "BirthDate, Address, Gender ..." _
                 & " VALUES (@p1, @p2...)"
    

    使用任何一种方法,OP中缺失的parens都会更加明显,并且根本不太可能发生。接下来,一些列似乎是数字,例如Salary和BirthDate,因此这样的SQL可能是错误的:

    ... & "','" & txtbdate.Text & "','" & txtsalary.Text & "','" ...
    

    在值周围放置tick会确保您将String传递给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
    

    另一个问题是代码似乎没有执行任何数据验证。如果他们输入&#34;我喜欢馅饼&#34;作为薪水?或者输入&#34; 02/31/1986&#34; (mm / dd)为BirthDate?您的代码将深入到此过程中。因此,对用户输入使用DateTime.TryParseInteger.TryParse之类的内容进行数据验证时应该(可能已经)进一步向上游进行。

答案 2 :(得分:1)

缺少右括号)

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)

答案 3 :(得分:1)

你错过了右括号。改变它

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)