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

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

        环境:WindowXP SP2, VS2005, SQL2005

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

 1


C#操作存储过程,输入参数,返回结果_数据库连接set ANSI_NULLS ON

 2C#操作存储过程,输入参数,返回结果_数据库连接set QUOTED_IDENTIFIER ON

 3C#操作存储过程,输入参数,返回结果_数据库连接go

 4C#操作存储过程,输入参数,返回结果_数据库连接

 5C#操作存储过程,输入参数,返回结果_数据库连接

 6C#操作存储过程,输入参数,返回结果_数据库连接-- =============================================

 7C#操作存储过程,输入参数,返回结果_数据库连接-- Author:        <Vitoria Tang>

 8C#操作存储过程,输入参数,返回结果_数据库连接-- Create date: <2006.0804>

 9C#操作存储过程,输入参数,返回结果_数据库连接-- Description:    <It is a sample procedure for get sales record as specific datetime>

10C#操作存储过程,输入参数,返回结果_数据库连接-- =============================================

11C#操作存储过程,输入参数,返回结果_数据库连接ALTER PROCEDURE [dbo].[User_SalesByYear] 

12C#操作存储过程,输入参数,返回结果_数据库连接    -- Input parameters: Begin date, End date

13C#操作存储过程,输入参数,返回结果_数据库连接    @BeginDate datetime , @EndDate datetime, @Price int = 0 OUTPUT

14C#操作存储过程,输入参数,返回结果_数据库连接AS

15C#操作存储过程,输入参数,返回结果_数据库连接BEGIN

16C#操作存储过程,输入参数,返回结果_数据库连接    --declare @Price money

17C#操作存储过程,输入参数,返回结果_数据库连接    CREATE TABLE #TempTable

18C#操作存储过程,输入参数,返回结果_数据库连接    (ID int not null, ProductName nvarchar(40) not null, Price money not null)

19C#操作存储过程,输入参数,返回结果_数据库连接

20C#操作存储过程,输入参数,返回结果_数据库连接    INSERT INTO #TempTable(ID, ProductName, Price)

21C#操作存储过程,输入参数,返回结果_数据库连接        SELECT Orders.OrderID,  Products.ProductName, [Order Details].UnitPrice * [Order Details].Discount

22C#操作存储过程,输入参数,返回结果_数据库连接            FROM Orders, Products, [Order Details]

23C#操作存储过程,输入参数,返回结果_数据库连接            WHERE (

24C#操作存储过程,输入参数,返回结果_数据库连接                ((Orders.ShippedDate) Is Not Null And 

25C#操作存储过程,输入参数,返回结果_数据库连接                    (Orders.ShippedDate) Between @BeginDate And @EndDate)

26C#操作存储过程,输入参数,返回结果_数据库连接                    AND 

27C#操作存储过程,输入参数,返回结果_数据库连接                    (Orders.OrderID = [Order Details].OrderID AND [Order Details].ProductID = Products.ProductID)

28C#操作存储过程,输入参数,返回结果_数据库连接                );

29C#操作存储过程,输入参数,返回结果_数据库连接

30C#操作存储过程,输入参数,返回结果_数据库连接   Select * from #TempTable

31C#操作存储过程,输入参数,返回结果_数据库连接    

32C#操作存储过程,输入参数,返回结果_数据库连接   Select @Price = sum(Price) from [#TempTable]

33C#操作存储过程,输入参数,返回结果_数据库连接   Print @Price

34C#操作存储过程,输入参数,返回结果_数据库连接   return (@Price)

35C#操作存储过程,输入参数,返回结果_数据库连接END

36C#操作存储过程,输入参数,返回结果_数据库连接


Sample界面:

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


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

1


C#操作存储过程,输入参数,返回结果_数据库连接private System.Data.SqlClient.SqlConnection _connection = null;

2C#操作存储过程,输入参数,返回结果_数据库连接private void InitializeSource()

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

4C#操作存储过程,输入参数,返回结果_存储过程_41      //’Server name’需要根据自己的实际SqlServer的机器名填上哦

5C#操作存储过程,输入参数,返回结果_存储过程_41      string connetctStr = "Data Source=’Server name’;Initial Catalog=NWind;Integrated Security=True";

6C#操作存储过程,输入参数,返回结果_存储过程_41      if( _connection == null)

7C#操作存储过程,输入参数,返回结果_存储过程_41            _connection = new System.Data.SqlClient.SqlConnection(connetctStr);

8C#操作存储过程,输入参数,返回结果_数据库连接_45}

9C#操作存储过程,输入参数,返回结果_数据库连接


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

 1


C#操作存储过程,输入参数,返回结果_数据库连接private SqlCommand GetCommand(object sender, EventArgs e)

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

 3C#操作存储过程,输入参数,返回结果_存储过程_41     // User_SalesByYear是存储过程的名字

 4C#操作存储过程,输入参数,返回结果_存储过程_41     string cmdText = "User_SalesByYear"; 

 5C#操作存储过程,输入参数,返回结果_存储过程_41     SqlCommand executeCmd = new SqlCommand();

 6C#操作存储过程,输入参数,返回结果_存储过程_41     executeCmd.Connection = _connection;

 7C#操作存储过程,输入参数,返回结果_存储过程_41     // 指出executeCmd是执行存储过程

 8C#操作存储过程,输入参数,返回结果_存储过程_41     executeCmd.CommandType = CommandType.StoredProcedure;

 9C#操作存储过程,输入参数,返回结果_存储过程_41     executeCmd.CommandText = cmdText;

10C#操作存储过程,输入参数,返回结果_存储过程_41     // 看上面的存储过程,因为是有三个输入参数,我们需要给填到SqlCommand.Parameters集合中

11C#操作存储过程,输入参数,返回结果_存储过程_41     // 参数一:BeginDate

12C#操作存储过程,输入参数,返回结果_存储过程_41     SqlParameter parameter = new SqlParameter( "@BeginDate", SqlDbType.DateTime);

13C#操作存储过程,输入参数,返回结果_存储过程_41     parameter.Value = new DateTime( 1995, 1,1);

14C#操作存储过程,输入参数,返回结果_存储过程_41     executeCmd.Parameters.Add(parameter);

15C#操作存储过程,输入参数,返回结果_存储过程_41     // 参数二:EndDate 

16C#操作存储过程,输入参数,返回结果_存储过程_41     parameter = new SqlParameter("@EndDate", SqlDbType.DateTime);

17C#操作存储过程,输入参数,返回结果_存储过程_41     parameter.Value = new DateTime(1995, 12, 30);

18C#操作存储过程,输入参数,返回结果_存储过程_41     executeCmd.Parameters.Add(parameter);

19C#操作存储过程,输入参数,返回结果_存储过程_41     // 参数三:Price,这是个输出参数,需要指明参数方向,否则存储过程的输出值不会写到参数中来

20C#操作存储过程,输入参数,返回结果_存储过程_41      parameter = new SqlParameter("@Price", 0);

21C#操作存储过程,输入参数,返回结果_存储过程_41      parameter.Direction = ParameterDirection.InputOutput;

22C#操作存储过程,输入参数,返回结果_存储过程_41      executeCmd.Parameters.Add(parameter);

23C#操作存储过程,输入参数,返回结果_存储过程_41     return executeCmd;

24C#操作存储过程,输入参数,返回结果_数据库连接_45}

25C#操作存储过程,输入参数,返回结果_数据库连接


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

 1


C#操作存储过程,输入参数,返回结果_数据库连接private void button1_Click(object sender, EventArgs e)

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

 3C#操作存储过程,输入参数,返回结果_存储过程_41      _connection.Open();

 4C#操作存储过程,输入参数,返回结果_存储过程_41      SqlDataAdapter adapter = new SqlDataAdapter();

 5C#操作存储过程,输入参数,返回结果_存储过程_41      adapter.SelectCommand = executeCmd;

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

 7C#操作存储过程,输入参数,返回结果_存储过程_41      DataSet source = new DataSet();

 8C#操作存储过程,输入参数,返回结果_存储过程_41      adapter.Fill(source);

 9C#操作存储过程,输入参数,返回结果_存储过程_41      // 输出存储过程的输出参数到Output window看看吧

10C#操作存储过程,输入参数,返回结果_存储过程_41      Console.WriteLine(executeCmd.Parameters[2].Value);

11C#操作存储过程,输入参数,返回结果_存储过程_41      this.dataGridView1.DataSource = source.Tables[0];

12C#操作存储过程,输入参数,返回结果_存储过程_41       _connection.Close();

13C#操作存储过程,输入参数,返回结果_数据库连接_45}

14C#操作存储过程,输入参数,返回结果_数据库连接