2015-12-24 8 views
0

Я пытаюсь использовать SQL-запрос в Access. Раньше у меня была эта проблема, но до сих пор не совсем понимаю, что я делаю неправильно. Я пытаюсь запустить инструкцию strSQL в MS Access, однако при попытке запустить код мне присваивается ошибка «Слишком мало параметров - ожидаемая 1».Форматирование SQL-запросов в MS Access

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 

CurveID = 15 

strSQL = "SELECT * FROM VolatilityOutput WHERE CurveID=" & CurveID & "ORDER BY MaturityDate" 

Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges) 

[...] 

Я хочу, чтобы выбрать из таблицы в Access, VolatilityOutput, для всех случаев, в которых CurveID = 15. Что случилось с тем, как я использовал strSQL?

+4

** [Возможная инъекция SQL] (https://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) ** Необходимо привязать параметры вместо конкатенации SQL-запроса , – lad2025

+7

Думаю, вам нужно дополнительное пространство в '' ORDER BY MaturityDate''. Обратите внимание на пробел после начальной цитаты. Но также, что @ lad2025 сказал ... используйте параметры вместо этого. – Hambone

+3

Как вы это написали, ваш SQL заявление будет выглядеть следующим образом: SELECT * FROM VolatilityOutput WHERE CurveID = 15ORDER BY MaturityDate Как заметил Hambone, вам нужно пространство между "и последний из вашего заявления –

ответ

2

Для чего это стоит, я могу повторить свое сообщение об ошибке, если я объявляю параметр и не назначать его:

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" 

(как одиночные и двойные кавычки), то не было бы никакой специальной обработки требуется. Довольно удивительно, не так ли?

Смежные вопросы