Ошибка: слишком мало параметров. Ожидается 3…при выполнении инструкции SQL в Access

#sql #ms-access #vba

#sql #ms-access #vba

Вопрос:

Я делал это раньше, просто проверял, существует ли запись уже в таблице, прежде чем я вставлю новую запись. Это было в основном то, что я сделал, но на этот раз я получаю сообщение об ошибке

 Error: "3061 Too few parameters. Expected 2."
 

Я пытался быть очень конкретным ( tblfromICPMS.Woid а не просто Woid ), думая, что это может помочь, но на самом деле это ничего не изменило. Я получаю конкретно в строке

 If rs.RecordCount = 0 Then
 

Это код, в котором ThisWoid, Analyte и ThisTestId являются локальными переменными:

 DIM rs As Object
strSQL = "SELECT tblfromICPMS.Woid, tblfromICPMS.Analyte, tblfromICPMS.TestID FROM tblFROMICPMS WHERE (tblFROMICPMS.woid = " amp; ThisWoid amp; ") AND (tblFROMICPMS.analyte = " amp; Analyte amp; ") AND (tblfromICPMS.Testid=" amp; ThisTestID amp; ") "
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then
   "insert record"
End IF 
 

ОБНОВЛЕНИЕ: сообщение об ошибке изменено на 1, ожидаемое после обновления sqlstr в комментариях, также включающее объявление rs. Для пояснения tblFromICPMS представляет собой таблицу, содержащую столбцы Woid, Analyte и TestID. Я извлек три значения и сохранил их в локальных переменных ThisWoid, Analyte и ThisTestId . Я хочу вставить запись, но сначала я должен посмотреть, существует ли она уже в tblfromICPMS. Также ThisWoid и Analite являются строками

Комментарии:

1. Вы пытались отлаживать? Боюсь, в том, что вы разместили здесь, у вас нет строки, которая указывает на ошибку. А что это такое? (tblFROMICPMS.woid = ThisWoid) . Что такое ThisWoid . Разве так не должно быть (tblFROMICPMS.woid = " amp; ThisWoid amp; ")" ?

2. Взгляните на TabelfromICPMS.TestID . Это должно быть tblfromICPMS.TestID вместо.

3. Вы объединяете эту строку sql в фактическом коде? Если вы пройдете, вы увидите, что оператор буквально SELECT tblfromICPMS.Woid, tblfromICPMS.Analyte, TabelfromICPMS.TestID FROM tblFROMICPMS WHERE (tblFROMICPMS.woid = ThisWoid) AND (tblFROMICPMS.analyte = Analyte) AND (tblfromICPMS.Testid=ThisTestID) там, где вы хотите что-то вроде «WHERE (tblFromICPMS.woid = » amp; strVariable amp; «) И » `

4. Можете ли вы включить объявление для rs?

5. В принципе, мы все согласны с тем, что вы должны попробовать эту строку "SELECT tblfromICPMS.Woid, tblfromICPMS.Analyte, tblfromICPMS.TestID FROM tblFROMICPMS WHERE (tblFROMICPMS.woid = " amp; ThisWoid amp; ") AND (tblFROMICPMS.analyte = " amp; Analyte amp; ") AND (tblfromICPMS.Testid=" amp; ThisTestID amp; ") " , а также, если какое-либо из ваших условий сравнивается со строкой, вам нужна одинарная кавычка с каждой стороны, как "... ='" amp; var amp; "' and ..."

Ответ №1:

Прежде всего, я бы попробовал уменьшить размер rs как набора записей, а не объекта. Кроме того, вставьте окно сообщения, чтобы убедиться, что ваша строка SQL имеет смысл:

 DIM rs As Recordset
strSQL = "SELECT Woid, Analyte, TestID FROM tblFROMICPMS WHERE (woid = " amp; ThisWoid amp; ") AND (analyte = " amp; Analyte amp; ") AND (Testid=" amp; ThisTestID amp; ") "
msgbox strSQL
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.RecordCount = 0 Then
   "insert record"
End IF 
 

Посмотрите, дают ли результаты окна сообщения какие-либо подсказки относительно того, что не так. Обычно эта ошибка возникает, когда Access не понимает одну из ваших переменных.

Не забывайте, что текст в вашей строке SQL должен быть заключен в одинарные кавычки, а целые числа — нет.