-2

我正在使用下面的代码在“事务表”中创建新记录,插入语句的第二行抛出错误:参数太少。我已经仔细检查了所有字段名称都是正确的。还有什么可能导致这种类型的错误?

' Modify this line to include the path to Northwind
' on your computer.
Set dbs = CurrentDb

Dim vblCustomerID As String
Dim vblMealType As String
Dim Charge As Currency
Dim vblDate As String
vblDate = Format(Date, "yyyy-mm-dd")
txtCustomerID.SetFocus
vblCustomerID = txtCustomerID.Text

txtMealType.SetFocus
vblMealType = txtMealType.Text

txtCharge.SetFocus
vblCharge = txtCharge.Text

dbs.Execute "INSERT INTO dbo_Transactions" _
    & "(CustomerID, MealID, TransactionAmount, TransactionDate) VALUES " _
    & "(" & vblCustomerID & ", " & vblMealType & ", " & vblCharge & ", " & vblDate & ");"
dbs.Close
4

2 回答 2

1

正如其他人所建议的那样,使用参数化查询是一种更好的方式来做你想做的事情。尝试这样的事情:

Dim qdf As DAO.QueryDef
Set qdf = dbs.CreateQueryDef("", _
        "PARAMETERS prmCustomerID Long, prmMealID Long, prmTransactionAmount Currency, prmTransactionDate DateTime;" & _
        "INSERT INTO dbo_Transactions (CustomerID, MealID, TransactionAmount, TransactionDate) " & _
        "VALUES ([prmCustomerID], [prmMealID], [prmTransactionAmount], [prmTransactionDate]) ")
qdf!prmCustomerID = txtCustomerID.Value
qdf!prmMealID = txtMealType.Value
qdf!prmTransactionAmount = txtCharge.Value
qdf!prmTransactionDate = Date()
qdf.Execute dbFailOnError
Set qdf = nothing
于 2013-11-13T18:22:59.780 回答
0

您加载到 vbl 字段中的任何文本字段是否包含此类特殊字符?

, ' " 

一个完美的 SQL 插入命令中的文本字段中的所有这些都可能搞砸,我敢打赌这就是这里发生的事情。

如果您在此处实际使用参数,而不是将文本框中的文本直接加载到 SQL 查询中,那会更好,因为您正在向 SQL 注入开放。如果有人打字怎么办

"; Drop Table dbo_Transactions;

在您的一个文本框中,您运行此查询?然后,您的数据库完全搞砸了,因为有人刚刚删除了您的一张表。

一些关于使用参数来防止此问题的信息的链接,我敢打赌这也将解决您遇到的参数太少的问题。

http://forums.asp.net/t/886691.aspx

http://sqlmag.com/blog/t-sql-parameters-and-variables-basics-and-best-practices

于 2013-11-13T18:09:34.703 回答