C#操作存储过程,输入参数,返回结果

SQL存储过程显然是非常强大的,.NET也支持对存储过程的调用,自己尝试着写了个小Sample,因为在SQL的学习中,只是笔记一篇。

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

 1 None.gif set  ANSI_NULLS  ON
 2 None.gif set  QUOTED_IDENTIFIER  ON
 3 None.gif go
 4 None.gif
 5 None.gif
 6 None.gif --  =============================================
 7 None.gif--  Author:        <Vitoria Tang>
 8 None.gif--  Create date: <2006.0804>
 9 None.gif--  Description:    <It is a sample procedure for get sales record as specific datetime>
10 None.gif--  =============================================
11 None.gif ALTER   PROCEDURE   [ dbo ] . [ User_SalesByYear ]  
12 None.gif     --  Input parameters: Begin date, End date
13 None.gif      @BeginDate   datetime  ,  @EndDate   datetime @Price   int   =   0  OUTPUT
14 None.gif AS
15 None.gif BEGIN
16 None.gif     -- declare @Price money
17 None.gif      CREATE   TABLE  #TempTable
18 None.gif    (ID  int   not   null , ProductName  nvarchar ( 40 not   null , Price  money   not   null )
19 None.gif
20 None.gif     INSERT   INTO  #TempTable(ID, ProductName, Price)
21 None.gif         SELECT  Orders.OrderID,  Products.ProductName,  [ Order Details ] .UnitPrice  *   [ Order Details ] .Discount
22 None.gif             FROM  Orders, Products,  [ Order Details ]
23 None.gif             WHERE  (
24 None.gif                ((Orders.ShippedDate)  Is   Not   Null   And  
25 None.gif                    (Orders.ShippedDate)  Between   @BeginDate   And   @EndDate )
26 None.gif                     AND  
27 None.gif                    (Orders.OrderID  =   [ Order Details ] .OrderID  AND   [ Order Details ] .ProductID  =  Products.ProductID)
28 None.gif                );
29 None.gif
30 None.gif    Select   *   from  #TempTable
31 None.gif    
32 None.gif    Select   @Price   =   sum (Price)  from   [ #TempTable ]
33 None.gif    Print   @Price
34 None.gif    return  ( @Price )
35 None.gif END
36 None.gif

Sample界面:
Sql_samples.PNG

        首先建立与数据库的连接:

1 None.gif private  System.Data.SqlClient.SqlConnection _connection  =   null ;
2 None.gif private   void  InitializeSource()
3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
4InBlock.gif      //’Server name’需要根据自己的实际SqlServer的机器名填上哦
5InBlock.gif      string connetctStr = "Data Source=’Server name’;Initial Catalog=NWind;Integrated Security=True";
6InBlock.gif      if( _connection == null)
7InBlock.gif            _connection = new System.Data.SqlClient.SqlConnection(connetctStr);
8ExpandedBlockEnd.gif}

9 None.gif

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

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

25 None.gif

        本文的示例是用SqlDataAdapter来填充了DataSet并把它显示在DataGridView control上,所以接下来,打开数据库连接创建SqlDataAdapter,并填充DataSet吧.

 1 None.gif private   void  button1_Click( object  sender, EventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif      _connection.Open();
 4InBlock.gif      SqlDataAdapter adapter = new SqlDataAdapter();
 5InBlock.gif      adapter.SelectCommand = executeCmd;
 6InBlock.gif
 7InBlock.gif      DataSet source = new DataSet();
 8InBlock.gif      adapter.Fill(source);
 9InBlock.gif      // 输出存储过程的输出参数到Output window看看吧
10InBlock.gif      Console.WriteLine(executeCmd.Parameters[2].Value);
11InBlock.gif      this.dataGridView1.DataSource = source.Tables[0];
12InBlock.gif       _connection.Close();
13ExpandedBlockEnd.gif}

14 None.gif

转载于:https://www.cnblogs.com/xiongeee/archive/2007/02/28/659684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值