2015-12-24 136 views
0

我想在Access中使用SQL查詢。我之前有過這個問題,但仍然沒有完全理解我做錯了什麼。我試圖在MS Access中運行strSQL語句,但是當我嘗試運行代碼時,它給了我「太少的參數 - 預期1」的錯誤。在MS Access中格式化SQL查詢

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) 

[...] 

我想從一個表中訪問,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) 

給我要報告同樣的事情:

太幾個參數。預計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" 

(包括單引號和雙引號),將不需要特殊處理。很棒,對嗎?