ACCESS / SQL - 参数太少

时间:2013-11-13 17:46:45

标签: sql database ms-access

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

' 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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