`
sptgreen
  • 浏览: 45522 次
  • 性别: Icon_minigender_1
  • 来自: 荆门
社区版块
存档分类
最新评论

c#调用存储过程两种方法

    博客分类:
  • .NET
阅读更多
摘要 存储过程的调用在B/S系统中用的很多。传统的调用方法不仅速度慢,而且代码会随着存储过程的增多不断膨胀,难以维护。新的方法在一定程度上解决了这些问题。

  关键词 ASP.NET;存储过程
 
  在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的。

  存储过程简介

  简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。

  根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

  使用存储过程的好处

  相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:

  (1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

  (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。

  (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。

  (4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。

  由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。

  两种不同的存储过程调用方法

  为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。

  要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。

  就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。

  (1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  然后只要选择适当的方式执行此处过程,用于不同的目的即可。

  (2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)):
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
(以上代码相同,以下为要添加的代码)
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  这样就添加了一个输入参数。若需要添加输出参数:

//设置存储过程的参数值,其中@ParameterName为存储过程的参数.
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate); //存储过程参数值;
da.SelectCommand.Parameters.Add(param);

  若要获得参储过程的返回值:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

执行:   DataSet myds=new DataSet();
da.Fill(myds,"tableName");

  从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?

  于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!

  两种调用方法的比较
  
  通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。

用来创建DataRead的存储过程调用;
       
             //数据库连接字符串
             string      connStr="Server=localhost;database=stuIMS;uid=sa;pwd=admin";
             //建立连接
             SqlConnection conn=new SqlConnection(connStr);
             //建立查询命令
             SqlCommand myCommand=new SqlCommand("存储过程名",conn);           
             //调用存储过程名
             myCommand.CommandType=CommandType.StoredProcedure;

             //设置存储过程的参数值,其中@id 为存储过程的参数.
             SqlParameter id=myCommand.Parameters.Add("@id",SqlDbType.NText);
             id.Value=存储过程参数值;

             //执行命令
             SqlDataReader reader=myCommand.ExecuteReader();//读取数据
             //或者
             SqlDataReader reader=myCommand.ExecuteNonQuery();//数据更新
分享到:
评论

相关推荐

    c#调用存储过程两种方法 - - c# sql .net asp.net

    c#调用存储过程两种方法 - - c# sql .net asp.net

    在C#中调用存储过程两种方法

    在C#中调用存储过程主要有两种方法,这两种方法都在.NET框架下被广泛使用,尤其在B/S系统中,存储过程的调用扮演了重要角色。传统的调用方式可能存在效率低、代码冗余等问题,而新的方法则在一定程度上优化了这些...

    c#调用存储过程

    C#作为一种强大的面向对象编程语言,在.NET框架下可以通过ADO.NET或EF等技术与数据库进行交互,并能够高效地调用存储过程。 #### 二、案例分析 本节将通过一个具体的案例来讲解如何在C#中调用存储过程。案例中的...

    JAVA&C#调用存储过程代码

    以下是一个C#调用存储过程的示例: ```csharp using System; using System.Data.SqlClient; class Program { static void Main() { string connectionString = "Server=localhost;Database=testDB;User Id=...

    c#调用分页存储过程

    总结来说,C#调用分页存储过程是一种有效的处理大数据量的方法,它可以提高应用程序的性能,减少数据库压力。在实际项目中,根据具体需求调整存储过程和C#代码,以达到最佳的分页效果。通过学习和实践这个主题,...

    C#调用分页存储过程实例

    C#调用存储过程通常涉及到以下步骤: 1. **建立连接**:使用`SqlConnection`类创建数据库连接,需要提供正确的连接字符串,包括数据库服务器、数据库名、用户名和密码。 ```csharp string connectionString = ...

    c# 调用带参数的存储过程

    调用存储过程并获取结果 ```csharp dtDifferTime = SqlHelper.RunProceduresByParameter("pro_GetDifferenceTimeInfos", iDataDi); ``` 调用了`SqlHelper`类中的静态方法`RunProceduresByParameter`,该方法接收...

    c#调用存储过程的代码

    #### 使用C#调用存储过程 接下来,我们将讨论如何在C#中编写代码来调用上述存储过程。给定的代码片段展示了调用存储过程的基本步骤,下面对其进行详细解释。 1. **连接数据库**:首先,我们需要建立与数据库的连接...

    ORACLE存储过程简析及C#调用.docx

    注意,调用存储过程时需要指定完整的包名和过程名,如`OPERATE_PRODUCTION.GetPro`。 总之,Oracle的Package提供了一种强大的组织和管理数据库程序逻辑的方式,它允许在PL/SQL中创建复杂的数据处理逻辑,并通过Ref ...

    MySql 分页存储过程以及代码调用

    这里,我们使用了pymysql的cursor.callproc方法来调用存储过程,并获取返回的结果。`cursor.lastrowid`用来获取存储过程返回的最后一个值,即总行数。 总结来说,MySQL的分页存储过程提供了一种高效、可复用的方式...

    C#调用存储过程的通用类[借鉴].pdf

    本篇文章将详细探讨如何使用C#调用存储过程的通用类,以及其相关的方法。 首先,我们来看这个名为`StoreProcedure`的类,它的主要目的是提供一个简洁的方式来执行数据库中的存储过程。这个类有两个私有成员变量,...

    c#调用oracle存储过程[定义].pdf

    存储过程有两种类型:存储过程(只执行,不返回值)和函数(执行并返回一个值)。程序包则是一个包含多个存储过程和函数的逻辑单元,用于组织相关的功能。 创建存储过程的语法如下: ```sql CREATE [OR REPLACE] ...

    C#调用Delphi dll库文件

    本文将深入探讨如何在C# 2013中调用Delphi 7编写的DLL库文件,包括通过函数和存储过程两种方式。 首先,理解基本原理:C#调用DLL主要依赖于P/Invoke(Platform Invoke)特性,这是.NET Framework提供的一种机制,...

    C# 存储过程实现分页

    此外,如果你使用的是ORM框架,如Entity Framework,调用存储过程的方式可能会有所不同,但基本思路是一致的。 总之,通过在C#中使用SQL Server的存储过程,我们可以有效地实现分页功能,从而提高数据检索效率并...

    C#调用oracle储存过程例子

    6. **C#调用Oracle存储过程**:在C#中,我们可以使用Oracle Managed Data Access (ODP.NET)库来调用存储过程。首先,确保安装了Oracle的ODP.NET驱动,然后创建连接,执行存储过程: ```csharp using Oracle....

    ATM C#使用存储过程实现的程序

    在调用存储过程后,根据返回值或异常处理结果,为用户提供相应的反馈。 总结来说,ATM C#程序利用存储过程的优势,实现了高效、安全的数据库交互。通过这种方式,开发人员可以更专注于业务逻辑,而不用过多关心底层...

    c#中两种不同的存储过程调用与比较

    下面分别介绍存储过程的基本概念、好处以及在.NET框架中调用存储过程的两种方法。 存储过程是一组为了完成特定功能的SQL语句集和控制语句,被存储在数据库中,可以通过特定的命令进行调用执行。它们在数据库中具有...

    C# 调用WebService的方法

    【C# 调用WebService的方法】 在.NET Framework的开发中,经常需要与其他系统或服务进行接口集成,其中一种常见的通信方式就是使用WebService...理解这两种方法的使用,能更好地应对不同情况下的WebService交互需求。

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    在C#调用C++ DLL的过程中,正确处理字符串参数是非常重要的。通过设置适当的`CharSet`和`CallingConvention`属性,并使用`MarshalAs`来显式控制字符串转换,可以有效避免崩溃问题。同时,细致的错误检查和调试策略也...

    C# sql分页存储过程例子

    接下来,在C#代码中,我们需要使用ADO.NET连接到数据库并调用这个存储过程。首先,建立数据库连接,然后创建SqlCommand对象,设置存储过程名,并添加参数。最后,使用SqlCommand的ExecuteReader方法执行存储过程并...

Global site tag (gtag.js) - Google Analytics