环境:WindowXP SP2, VS2005, SQL2005
假定在SQL server上已经存在了NWind数据库,同时有如下的存储过程:(存储过程的功能是根据输入的起始日期和结束日期,返回这个时间段内的销售记录和总销售值,并非本文重点)
set ANSI_NULLS ON2
set QUOTED_IDENTIFIER ON3
go4

5

6
-- =============================================7
-- Author: <Vitoria Tang>8
-- Create date: <2006.0804>9
-- Description: <It is a sample procedure for get sales record as specific datetime>10
-- =============================================11
ALTER PROCEDURE [dbo].[User_SalesByYear] 12
-- Input parameters: Begin date, End date13
@BeginDate datetime , @EndDate datetime, @Price int = 0 OUTPUT14
AS15
BEGIN16
--declare @Price money17
CREATE TABLE #TempTable18
(ID int not null, ProductName nvarchar(40) not null, Price money not null)19

20
INSERT INTO #TempTable(ID, ProductName, Price)21
SELECT Orders.OrderID, Products.ProductName, [Order Details].UnitPrice * [Order Details].Discount22
FROM Orders, Products, [Order Details]23
WHERE (24
((Orders.ShippedDate) Is Not Null And 25
(Orders.ShippedDate) Between @BeginDate And @EndDate)26
AND 27
(Orders.OrderID = [Order Details].OrderID AND [Order Details].ProductID = Products.ProductID)28
);29

30
Select * from #TempTable31
32
Select @Price = sum(Price) from [#TempTable]33
Print @Price34
return (@Price)35
END36

Sample界面:
首先建立与数据库的连接:
private System.Data.SqlClient.SqlConnection _connection = null;2
private void InitializeSource()3


{4
//’Server name’需要根据自己的实际SqlServer的机器名填上哦5
string connetctStr = "Data Source=’Server name’;Initial Catalog=NWind;Integrated Security=True";6
if( _connection == null)7
_connection = new System.Data.SqlClient.SqlConnection(connetctStr);8
}9

其次创建执行存储过程的SqlCommand,当然前后需要打开和关闭数据库连接,调用存储过程需要给SqlCommand的CommandType属性赋值为 CommandType.StoredProcedure,我们的存储过程是有输入和输出参数的,那么在添加到SqlCommand.Prameters 集合中就可以了。如果是输出参数,设置SqlParameter实例的Direction值就可以了,该属性默认值为Input,所以不设置的话,在执行完后,得不到输出值哦。具体参见下面的代码。
private SqlCommand GetCommand(object sender, EventArgs e)2


{3
// User_SalesByYear是存储过程的名字4
string cmdText = "User_SalesByYear"; 5
SqlCommand executeCmd = new SqlCommand();6
executeCmd.Connection = _connection;7
// 指出executeCmd是执行存储过程8
executeCmd.CommandType = CommandType.StoredProcedure;9
executeCmd.CommandText = cmdText;10
// 看上面的存储过程,因为是有三个输入参数,我们需要给填到SqlCommand.Parameters集合中11
// 参数一:BeginDate12
SqlParameter parameter = new SqlParameter( "@BeginDate", SqlDbType.DateTime);13
parameter.Value = new DateTime( 1995, 1,1);14
executeCmd.Parameters.Add(parameter);15
// 参数二:EndDate 16
parameter = new SqlParameter("@EndDate", SqlDbType.DateTime);17
parameter.Value = new DateTime(1995, 12, 30);18
executeCmd.Parameters.Add(parameter);19
// 参数三:Price,这是个输出参数,需要指明参数方向,否则存储过程的输出值不会写到参数中来20
parameter = new SqlParameter("@Price", 0);21
parameter.Direction = ParameterDirection.InputOutput;22
executeCmd.Parameters.Add(parameter);23
return executeCmd;24
}25

本文的示例是用SqlDataAdapter来填充了DataSet并把它显示在DataGridView control上,所以接下来,打开数据库连接创建SqlDataAdapter,并填充DataSet吧.
private void button1_Click(object sender, EventArgs e)2


{3
_connection.Open();4
SqlDataAdapter adapter = new SqlDataAdapter();5
adapter.SelectCommand = executeCmd;6

7
DataSet source = new DataSet();8
adapter.Fill(source);9
// 输出存储过程的输出参数到Output window看看吧10
Console.WriteLine(executeCmd.Parameters[2].Value);11
this.dataGridView1.DataSource = source.Tables[0];12
_connection.Close();13
}14

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1544564
本文介绍了一个SQL存储过程的示例,该过程用于获取指定日期范围内的销售记录及总销售额。通过.NET Framework中的SqlConnection和SqlCommand组件实现对存储过程的调用。
754

被折叠的 条评论
为什么被折叠?



