Для чего это стоит, я могу повторить свое сообщение об ошибке, если я объявляю параметр и не назначать его:
strSQL = "parameters [CID] number; " & _
"SELECT * FROM VolatilityOutput WHERE CurveID=" & CurveID & " ORDER BY MaturityDate"
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
дает мне ту же самую вещь, которую вы сообщаете:
Too Несколько параметров. Ожидаемые 1
Я думаю, вы могли бы убить двух птиц одним камнем здесь - исправить свою ошибку и использовать параметры, как предлагают несколько из этой темы. Это пример того, как вы могли бы вызвать параметр:
Sub SampleReadCurve()
Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
Dim CurveID As Long
Dim MarkRunID As Long
Dim ZeroCurveID As String
Dim qry As QueryDef
CurveID = 15
strSQL = "parameters [CID] number; " & _
"SELECT * FROM VolatilityOutput WHERE CurveID = [CID] ORDER BY MaturityDate"
Set qry = CurrentDb.CreateQueryDef("GetCurve", strSQL)
qry.Parameters("CID") = CurveID
Set rs = qry.OpenRecordset
CurrentDb.QueryDefs.Delete ("GetCurve")
End Sub
Имейте в виду, что это создает определение запроса и затирает его каждый раз пробеги к югу, что не лучшая практика. Я хотел бы изменить это, чтобы объявить запрос раньше времени (через нормальный доступ, не VBA) и вызывать его в суб, оставляя его там в следующий раз вам это нужно:
Set qry = CurrentDb.QueryDefs("GetCurve")
В заключительной ноте, в том числе многочисленные преимущества использования параметра/параметра привязки заключаются в том, что типы данных управляются. Это означает, что если CurveID был датой или строкой, эта методология все равно будет работать. Вам не нужно будет менять SQL для включения кавычек или какой-либо специальной обработки для форматов даты - переменные привязки позаботятся об этом для вас. Это означает, что если строка была:
I'd like to say "hello"
(как одиночные и двойные кавычки), то не было бы никакой специальной обработки требуется. Довольно удивительно, не так ли?
** [Возможная инъекция SQL] (https://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) ** Необходимо привязать параметры вместо конкатенации SQL-запроса , – lad2025
Думаю, вам нужно дополнительное пространство в '' ORDER BY MaturityDate''. Обратите внимание на пробел после начальной цитаты. Но также, что @ lad2025 сказал ... используйте параметры вместо этого. – Hambone
Как вы это написали, ваш SQL заявление будет выглядеть следующим образом: SELECT * FROM VolatilityOutput WHERE CurveID = 15ORDER BY MaturityDate Как заметил Hambone, вам нужно пространство между "и последний из вашего заявления –