SQL存储过程显然是非常强大的,.NET也支持对存储过程的调用,自己尝试着写了个小Sample,因为在SQL的学习中,只是笔记一篇。
环境:WindowXP SP2, VS2005, SQL2005
假定在SQL server上已经存在了NWind数据库,同时有如下的存储过程:(存储过程的功能是根据输入的起始日期和结束日期,返回这个时间段内的销售记录和总销售值,并非本文重点)
1
set
ANSI_NULLS
ON
2
set
QUOTED_IDENTIFIER
ON
3
go
4
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 date
13
@BeginDate
datetime
,
@EndDate
datetime
,
@Price
int
=
0
OUTPUT
14
AS
15
BEGIN
16
--
declare @Price money
17
CREATE
TABLE
#TempTable
18
(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
]
.Discount
22
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
#TempTable
31
32
Select
@Price
=
sum
(Price)
from
[
#TempTable
]
33
Print
@Price
34
return
(
@Price
)
35
END
36

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

Sample界面:
首先建立与数据库的连接:
1
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

2

3



4

5

6

7

8

9

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

2



3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

2



3

4

5

6

7

8

9

10

11

12

13

14
