2013-11-13 4 views
-2

Я использую следующий код для создания новой записи в «таблице транзакций», вторая строка оператора вставки вызывает ошибку: Слишком мало параметров. Я проверил дважды, и все имена полей верны. Что еще может вызвать такой тип ошибок?ACCESS/SQL - Слишком мало параметров

' 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

Пожалуйста, используйте [параметризованные запросы] (http://stackoverflow.com/questions/95277/how-do-you-create-a-parameterized-query-in-ms-access- 2003-and-use-other-queries) при выполнении SQL; в противном случае вы крайне уязвимы для SQL-инъекций. Это также должно устранить вашу проблему. – LittleBobbyTables

+0

Я бы предложил изменить код, чтобы вы сначала создали строку SQL и назначили ее переменной, а затем dbs.Execute эту переменную. Таким образом, вы можете поместить контрольную точку в переменную и посмотреть, что Access считает строкой SQL. В большинстве случаев, что Access считает, что это так, и что вы думаете, это совершенно другое. –

+0

Вы уверены, что все ваши переменные имеют значения? – mucio

ответ

0

Выполнение любых текстовых полей, которые вы загружаете в свои поля vbl, содержит специальные символы, подобные этим?

, ' " 

Все те, в текстовом поле в совершенно хорошей команде SQL Insert мог ввернуть вещи, я уверен, что это то, что здесь происходит.

Было бы лучше, если бы вы фактически использовали здесь параметры, вместо того, чтобы загружать текст в текстовые поля непосредственно в ваши 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

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 
Смежные вопросы