我有一个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()
答案 0 :(得分:2)
您忘记了结束)
...... l.Value& "''" &安培; s& "' )",con)
答案 1 :(得分:2)
缺少的关闭问题是你所拥有的一个较小的问题:
为地址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.TryParse
和Integer.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)