2012-01-16 96 views
0

最近我一直在寫參數化查詢是這樣的:ASP /參數化查詢如何工作?

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (?, ?, ?); " 

Set newParameter = cmdConn.CreateParameter("@column1", ad_Integer, ad_ParamInput, Len(input1), input1) 
cmdConn.Parameters.Append newParameter 
Set newParameter = cmdConn.CreateParameter("@column2", ad_Integer, ad_ParamInput, Len(input2), input2) 
cmdConn.Parameters.Append newParameter 
Set newParameter = cmdConn.CreateParameter("@column3", ad_Integer, ad_ParamInput, Len(input3), input3) 
cmdConn.Parameters.Append newParameter 

而我的理解,這其中追加一個新的參數,當我用@ COLUMN1,這是在參數分配到特定的列該查詢...但最近被告知其他情況。然後,這引起了一些混淆,並有幾個問題。

取上述參數@ column1。該參數如何知道它將在查詢的第一個問號(?)中使用?我是否必須以與問號相同的順序追加參數,或者它與哪個訂單無關?另外,如果我想將用戶輸入添加到兩列,我使用兩個參數還是可以使用同一個參數?

任何幫助感激地收到。這已經在我腦海裏數週了,所以真的很期待解釋:)

回答

5

在參數化查詢中,數據庫用它們添加順序中的參數替換問號。

所以COLUMN1參數將進入問號1,列2參數將進入問號2和欄3參數將進入問號3

更多check

+0

對,所以附加在同一順序的新參數查詢是必要的。謝謝澄清。所以這意味着我最後一個問題,我可以使用兩列相同的參數,是否爲假? – TheCarver 2012-01-16 20:10:01

+0

你可以,但你必須追加兩次 – 2012-01-16 20:11:35

+0

我現在明白了參數,謝謝。 – TheCarver 2012-01-16 20:14:25

1

如果使用的是問號, parameters參數必須按照您希望在查詢中使用它們的順序追加到Parameters集合中。

使用Append將其他參數按照定義順序添加到Parameters集合中。 來源:ADO collections documentation, number 2

查詢每個參數都需要一個參數附加到Parameters集合。在您的示例查詢中,查詢中的3個參數(不管它們是否是用戶輸入的)意味着3個參數必須存在於Parameters集合中,並且它們必須按它們在查詢字符串中出現的順序進行追加。

+0

再次感謝您的意見。不幸的是,和你的答案一樣好,伊曼紐爾先到了那裏。我現在完全瞭解參數如何工作:) – TheCarver 2012-01-16 20:13:37

1

另請注意,您可以使用命名參數,在這種情況下,追加參數的順序不再重要,因爲它們是按名稱匹配的。在使用SQL Server提供ADO.NET:

Dim CommandText as String = "SELECT * FROM Table WHERE ColumnA = @A AND ColumnB = @B" 
Dim command As New SqlCommand(CommandText) 

''#Parameters added in reverse order, still works 

command.Parameters.Add(new SqlParameter("@B", 42)) 
command.Parameters.Add(new SqlParameter("@A", "Test")) 

但是,這並不與工作OLE DB .NET Provider

的OLE DB .NET提供程序不支持命名的參數傳遞 參數的SQL語句或當CommandType設置爲Text時由 OleDbCommand調用的存儲過程。在這種情況下,必須使用 問號(?)佔位符。

因此,將OleDbParameter對象添加到 OleDbParameterCollection的順序必須直接對應於命令文本中參數的問號佔位符的位置 。

+0

感謝您的輸入。你說我不能在OLE DB.NET中使用命名參數。這是否意味着我可以在所有Classic ASP方案中使用命名參數? – TheCarver 2012-01-16 21:13:40

+0

不是100%肯定的,我幾年以來沒有做過Classic ASP,但我相信如果你在SQL Server中使用存儲過程,那麼是的。您可能必須將命令的NamedParameters設置爲True。請參閱MSDN上的[(舊)文章](http://msdn.microsoft.com/zh-cn/library/aa496035) – 2012-01-16 21:22:27

1

當您使用以下,你有沒有約束的名字的參數,因此他們必須通過自己的順序位置來填充,但是,它是幸運的,你按照正確的順序綁定的名稱參數:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (?, ?, ?); " 

當您綁定的名字參數,你可以不喜歡重複使用它們,從而節省時間和內存調皮的事情:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (@a, @b, @a); "