使用存储过程的原因:创建—个过程并把它存储在数据库中,因为事先知道有这个过程,所以可以提前编译它,以便在应用程序中使用。
在代码中使用存储过程的另一个好处是一般比较安全。使用没有存储过程的SQL时,总是需要通过连接字符串来建立SQL语句。这样就比较危险——如果一些字符串是用户生成的,就更危险,因为所得的SQL可能无效或是恶意的。
1.创建存储过程
存储过程可以是一个SQL语句,也可以是一组复杂的语句。T-SQL支持分支、循环和其他类型的变量声明,这有助于编写出一些非常复杂的存储过程代码。下面是一个存储过程的代码:
ALTER PROCEDURE usp_authors_Get_By_ID
@au_id varchar(11)
AS
Select
au_id,au_lname,au_fname,phone,address,city,state,zip,contract
From
authors
Where
au_id=@au_id
2.调用存储过程
为了调用存储过程,只需创建一个连接到数据库的SqIConnection对象,再创建一个SqlCommand对象运行该存储过程即可。
现在要确定是否通过调用存储过程返回一些数据。在下面的例子中,将返回一个SqIDataReader对象的实例。创建一个GetAuthorSqIReader方法,该方法需要一个作者的ID作为参数,并返回一个SqIDataReader的实例作为结果。
在SqICommand的构造函数调用中使用了一个独立的辅助方法,该方法创建了对pubs数据库的连接方法:GetPubsConnection。用My.Settings空间会简化代码。
Imports System.Data.SqlClient
Module Module1
Sub Main()
testStoreProcedure()
Console.Read()
End Sub
Private Function GetAuthorSqlReader(ByVal authorId As String) As SqlDataReader
Dim comm As SqlCommand = New SqlCommand("usp_authors_Get_By_ID", GetPubsConnection())
comm.CommandType = CommandType.StoredProcedure
comm.Parameters.Add(New SqlParameter("@au_id", authorId))
comm.Connection.Open()
Return comm.ExecuteReader(CommandBehavior.CloseConnection)
End Function
Private Function GetPubsConnection() As SqlConnection
'这里可是绝技,试错N次才找成功
Return New SqlConnection(My.Settings.pubsConnectionString)
End Function
Private Sub testStoreProcedure()
Dim reader As SqlDataReader = GetAuthorSqlReader("409-56-7008")
If reader.Read Then
Console.WriteLine(reader("au_fname").ToString & " " & reader("au_lname").ToString)
End If
End Sub
End Module
调用存储过程的具体方法如下所示:
- 创建一个SqICommand对象。
- 设置CommandType属性,把它配置为访问存储过程。
- 添加存储过程本身定义的参数。
- 使用SqICommand对象的一个ExecuteX方法执行存储过程。