ASP.NET 存储过程操作

存储过程是存放在数据库服务器上的预先编译好的sql语句。使用存储过程,可以直接在数据库中存储并运行功能强大的任务。存储过程在第一应用程序执行时进行语法检查和编译,编译好的版本保存在高速缓存中。在执行重复任务时,存储过程可以提高性能和一致性。由于存储过程可以将一系列对数据库的操作放在数据库服务器上执行,因而可以降低Web服务器的负载,提高整个系统的性能。

1、创建存储过程

代码 1 USE Northwind
 2 GO
 3 CREATE PROC [DBO].[GetOrdersByOrderDate]
 4     @OrderDate DATETIME
 5 AS
 6     SELECT
 7         [OrderID],[CustomerID],[OrderDate]
 8     FROM
 9         [Orders]
10     WHERE
11         [OrderDate] >= @OrderDate
12 
13 
14 USE Northwind
15 GO
16 EXEC GetByOrderDate '1996-10-10 0:00:00'
17

2、调用存储过程

代码 1             SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
 2 
 3             try
 4             {
 5                 SqlCommand cmd = new SqlCommand();
 6                 cmd.CommandText = "[GetOrdersByOrderDate]";
 7                 cmd.Connection = conn;
 8 
 9                 cmd.CommandType = CommandType.StoredProcedure;
10 
11                 cmd.Parameters.Add("@OrderDate", SqlDbType.DateTime, 8).Value = "1998-5-5";
12 
13                 conn.Open();
14 
15                 SqlDataAdapter da = new SqlDataAdapter();
16                 da.SelectCommand = cmd;
17 
18                 DataSet ds = new DataSet();
19 
20                 da.Fill(ds);
21 
22                 gvOrders.DataSource = ds;
23                 gvOrders.DataBind();
24             }
25             catch (SqlException ex)
26             {
27                 throw new Exception(ex.Message, ex);
28             }
29             finally
30             {
31                 conn.Close();
32             }
33         }
34

3、输出参数

存储过程可以通过输出参数来返回值。

代码 1 USE Northwind
 2 GO
 3 CREATE PROC [DBO].[GetOrderDetailsTotalByProductID]
 4     @ProductID INT,
 5     @Total MONEY OUTPUT
 6 AS
 7     SELECT @Total = SUM([UnitPrice]*[Quantity])
 8     FROM
 9         [Order Details]
10     WHERE
11         [ProductID] = @ProductID
12
代码 1 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
 2 
 3             try
 4             {
 5                 SqlCommand cmd = new SqlCommand();
 6                 cmd.CommandText = "[GetOrderDetailsTotalByProductID]";
 7                 cmd.Connection = conn;
 8 
 9                 cmd.CommandType = CommandType.StoredProcedure;
10 
11                 cmd.Parameters.Add("@ProductID", SqlDbType.Int, 4).Value = 21;
12                 cmd.Parameters.Add("@Total", SqlDbType.Money).Direction = ParameterDirection.Output;
13 
14                 conn.Open();
15                 cmd.ExecuteNonQuery();
16 
17                 lblTotal.Text = cmd.Parameters["@Total"].Value.ToString();
18             }
19             catch (SqlException ex)
20             {
21                 throw new Exception(ex.Message, ex);
22             }
23             finally
24             {
25                 conn.Close();
26             }
27

4、Return 返回值

使用返回值表示存储过程的执行状态,它类似于输出参数,其区别:

(1)、返回值只能返回sql整数值;

(2)、返回值不能在存储过程内部声明,它使用Transcat-SQL的RETURN语句返回;

代码 1 USE Northwind
 2 GO
 3 CREATE PROC [DBO].[GetOrdersByCustomerID]
 4     @CustomerID INT,
 5     @OrderDate DATETIME OUTPUT
 6 AS
 7     SELECT @OrderDate = MAX([OrderDate])
 8     FROM
 9         [Orders]
10     WHERE
11         [CustomerID] = @CustomerID
12 
13     IF @OrderDate IS NULL
14         RETURN 0
15     ELSE
16         RETURN 1
17
代码 1 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
 2 
 3             try
 4             {
 5                 SqlCommand cmd = new SqlCommand();
 6                 cmd.CommandText = "[GetOrdersByEmployeeID]";
 7                 cmd.Connection = conn;
 8 
 9                 cmd.CommandType = CommandType.StoredProcedure;
10 
11                 cmd.Parameters.Add("@ReturnValue", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue;
12                 cmd.Parameters.Add("@EmployeeID", SqlDbType.Int, 4).Value = 1;
13                 cmd.Parameters.Add("@OrderDate", SqlDbType.DateTime).Direction = ParameterDirection.Output;
14 
15                 conn.Open();
16                 cmd.ExecuteNonQuery();
17 
18                 lblReturnValue.Text = cmd.Parameters["@ReturnValue"].Value.ToString();
19                 lblOrderDate.Text = cmd.Parameters["@OrderDate"].Value.ToString();
20             }
21             catch (SqlException ex)
22             {
23                 throw new Exception(ex.Message, ex);
24             }
25             finally
26             {
27                 conn.Close();
28             }
29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

Oracle 表复杂查询之多表合并查询

本文使用到的是oracle数据库scott方案所带的表,scott是oracle数据库自带的方案,使用前请确保其解锁 ? Oracle合并查询一共有四种方式,分...

2126
来自专栏跟着阿笨一起玩NET

C# EPL USB 指令打印

1261
来自专栏代码拾遗

JPA 详解

Java Persistence API(JPA)是将Java对象和关系型数据库对象映射起来规范。实现这个规范后开发者可以使用相同的代码可以在任意的数据库中执行...

1962
来自专栏Java与Android技术栈

Scrypt 不止是加密算法,也是莱特币的挖矿算法

Scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。Scrypt 没有在生...

1394
来自专栏码匠的流水账

聊聊pg jdbc的queryTimeout及next方法

本文主要介绍一下pg jdbc statement的queryTimeout及resultSet的next方法

3341
来自专栏lgp20151222

SSH上一个随笔的基础上添加上hibernate支持

熟悉的pom.xml其中lo4g和slf4j这两个包第一眼看上去有点莫名奇妙,我也是这么觉得的,实际作用是在后台输出sql语句,不导入hibernate就会报错...

821
来自专栏木宛城主

Thinking In Design Pattern——Query Object模式

什么是Query Object模式 Query Object的架构设计 Query Object在服务层的应用 测试 Query Obj...

2196
来自专栏24K纯开源

RegQueryValueEx正确使用方法

      项目中需要读取注册表中的HKEY_CLASSES_ROOT主键下一个子键的值,看了看MSDN的说明,有RegOpenKeyEx和RegQueryVa...

2668
来自专栏陈满iOS

iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)

分类(category)与关联对象(Associated Object)作为objective-c的扩展机制的两个特性:分类,可以通过它来扩展方法;Associ...

4142
来自专栏PPV课数据科学社区

【学习】七天搞定SAS(六):宏的编写、程序调错

在SAS各种繁杂的PROC之后,还要来看看MACRO才可以嘛。又不能写函数... SAS中的MACRO:宏编写 MACRO主要是DO和%LET的各种组合,前者负...

3736

扫码关注云+社区

领取腾讯云代金券