到SQL Server的Access開發人員面臨著很多困難,然而最為棘手的問題是對動態SQL的處理。在Access中,將控件的行指定為一個字符串是相當普通的現象。例如,窗體上包含著很多的選擇器(SalesGroup,State/Province/Canton,Beginning Date以及Ending Date等等),Access開發人員一般都會檢查這些控件以查看哪些為Null,然後編寫SQL語句以刪除這些Null值。
通過這種方法連接到SQL Server具有以下幾點的缺點:
所有的處理都在客戶端完成,而不是在服務器中完成。
解析這些控件和處理SQLq語句的代碼顯得拖沓冗長。
這一方法容易導致SQL 混入攻擊(injection attacks)。
渴望擴展到SQL Server的Access開發人員必須解決兩個方面的問題:
1. 識別所有非基於名稱查詢的記錄和行的數據源。
2. 使用名稱查詢替代所有的查詢。
對於動態地處理查詢,可以以如下所示的代碼處理:
SELECT *
FROM SomeTables
WHERE ColumnOfInterest = Forms("myForm").ControlOfInterest
AND Column2OfInterest = Forms("myForm").Control2OfInterest
為了簡單起見,我們假設Access窗體上只包含兩個控件。Access方法將在代碼中解析控件的值,然後通過使用非零值的方法處理每一動態SQL查詢。
這是一種沒有向導的方式。你所需要的是一個存儲程序,這一存儲程序被參數化以接收來自窗體上控件的所有數據。例如,假設以上給定的兩個控件,存儲程序被自身的數據觸發,如果數值為Null,存儲程序就會“智能化地”執行。
這裡是實現這一過程的一個簡單技巧:
SELECT *
FROM SomeTables
WHERE ColumnOfInterest = 12345 OR ColumnOfInterest is NULL