合理使用ADO.NET參數(shù)
使用ADO.NET參數(shù)還是比較常用的,于是我研究了一下對 SqlCommand 和存儲過程使用參數(shù),在這里拿出來和大家分享一下,希望對大家有用。在數(shù)據(jù)驅(qū)動的應(yīng)用程序中,存儲過程具有許多優(yōu)勢。通過利用存儲過程,數(shù)據(jù)庫操作可以封裝在單個(gè)命令中,為獲取***性能而進(jìn)行優(yōu)化并通過附加的安全性得到增強(qiáng)。盡管可以通過在 SQL 語句中傳遞后接參數(shù)自變量的存儲過程名稱來調(diào)用相應(yīng)的存儲過程,但如果使用 ADO.NET DbCommand 對象的 Parameters 集合,則可以讓您更為明確地定義存儲過程參數(shù),并訪問輸出參數(shù)和返回值。
使用ADO.NET參數(shù)化語句在服務(wù)器上通過使用 sp_executesql 執(zhí)行,sp_executesql 允許重復(fù)使用查詢計(jì)劃。sp_executesql 批處理命令中的本地光標(biāo)或變量對于調(diào)用 sp_executesql 的批處理命令是不可見的。數(shù)據(jù)庫上下文中的更改只持續(xù)到 sp_executesql 語句的結(jié)尾。有關(guān)更多信息,請參見 SQL Server 聯(lián)機(jī)叢書。
#T#對 SqlCommand 使用參數(shù)以執(zhí)行 SQL Server 存儲過程時(shí),添加到 Parameters 集合中的參數(shù)的名稱必須與存儲過程中參數(shù)標(biāo)記的名稱相匹配。SQL Server 的 .NET Framework 數(shù)據(jù)訪問接口不支持問號 (?)使用ADO.NET參數(shù)傳遞到 SQL 語句或存儲過程的占位符。它將存儲過程中的參數(shù)視為命名參數(shù),并搜索匹配的參數(shù)標(biāo)記。例如,通過使用名為 @CustomerID 的參數(shù)定義 CustOrderHist 存儲過程。您的代碼在執(zhí)行該存儲過程時(shí),它也必須使用名為 @CustomerID 的參數(shù)。
此示例演示了如何調(diào)用 Northwind 示例數(shù)據(jù)庫中的 SQL Server 存儲過程。存儲過程的名稱為 dbo.SalesByCategory,它具有名為 @CategoryName 的輸入?yún)?shù),其數(shù)據(jù)類型為 nvarchar(15)。該代碼在 using 代碼塊內(nèi)創(chuàng)建一個(gè)新 SqlConnection,以便在過程結(jié)束時(shí)釋放連接。會創(chuàng)建 SqlCommand 和 SqlParameter 對象,并設(shè)置其屬性。SqlDataReader 會執(zhí)行 SqlCommand 并從存儲過程返回結(jié)果集,以在控制臺窗口中顯示相關(guān)輸出。
您可以選擇使用任一重載構(gòu)造函數(shù)在一個(gè)語句中設(shè)置多個(gè)屬性,而不是創(chuàng)建 SqlCommand 和 SqlParameter 對象,然后在各個(gè)語句中設(shè)置屬性。
Visual Basic
- Shared Sub GetSalesByCategory(ByVal connectionString As String, _
 - ByVal categoryName As String)
 - Using connection As New SqlConnection(connectionString)
 - ' Create the command and set its properties.
 - Dim command As SqlCommand = New SqlCommand()
 - command.Connection = connection
 - command.CommandText = "SalesByCategory"
 - command.CommandType = CommandType.StoredProcedure
 - ' Add the input parameter and set its properties.
 - Dim parameter As New SqlParameter()
 - parameter.ParameterName = "@CategoryName"
 - parameter.SqlDbType = SqlDbType.NVarChar
 - parameter.Direction = ParameterDirection.Input
 - parameter.Value = categoryName
 - ' Add the parameter to the Parameters collection.
 - command.Parameters.Add(parameter)
 - ' Open the connection and execute the reader.
 - connection.Open()
 - Dim reader As SqlDataReader = command.ExecuteReader()
 - If reader.HasRows Then
 - Do While reader.Read()
 - Console.WriteLine("{0}: {1:C}", _
 - reader(0), reader(1))
 - Loop
 - Else
 - Console.WriteLine("No rows returned.")
 - End If
 - End Using
 - End Sub
 
C#
- static void GetSalesByCategory(string connectionString,
 - string categoryName)
 - {
 - using (SqlConnection connection = new SqlConnection(connectionString))
 - {
 - // Create the command and set its properties.
 - SqlCommand command = new SqlCommand();
 - command.Connection = connection;
 - command.CommandText = "SalesByCategory";
 - command.CommandType = CommandType.StoredProcedure;
 - // Add the input parameter and set its properties.
 - SqlParameter parameter = new SqlParameter();
 - parameter.ParameterName = "@CategoryName";
 - parameter.SqlDbType = SqlDbType.NVarChar;
 - parameter.Direction = ParameterDirection.Input;
 - parameter.Value = categoryName;
 - // Add the parameter to the Parameters collection.
 - command.Parameters.Add(parameter);
 - // Open the connection and execute the reader.
 - connection.Open();
 - SqlDataReader reader = command.ExecuteReader();
 - if (reader.HasRows)
 - {
 - while (reader.Read())
 - {
 - Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
 - }
 - }
 - else
 - {
 - Console.WriteLine("No rows found.");
 - }
 - reader.Close();
 - }
 - }
 















 
 
 
 
 
 
 