手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

net中统一的存储过程调用方法

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


3.实现方法
实现的重点就放在如何根据存储过程名来得到它的所有的参数信息,再根据这些参数信息自动的创建各个参数。为了让这些动作自动化,声明SqlConnection、SqlCommand、SqlParameter的过程,创建各个SqlParameter的过程对用户来说都应该不可见。用户唯一需要提供的就是存储过程的名字,然后就是在调用的时候提供各个参数,甚至连他们的类型都不需要提供。

3.1获得和创建存储过程的参数
如何获得并且创建要调用的存储过程的参数是一个重点,通过信息结构视图我们可以自动的实现这个步骤。
// 获得和创建存储过程的参数

private void GetProcedureParameter(params object[] parameters)

{ SqlCommand myCommand2 = new SqlCommand();

myCommand2.Connection = this.myConnection;

myCommand2.CommandText = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME='" this.ProcedureName "' order by ORDINAL_POSITION";

SqlDataReader reader = null; reader = myCommand2.ExecuteReader(); // 创建返回参数

myParameter = new SqlParameter();

myParameter.ParameterName = "@Value";

myParameter.SqlDbType = SqlDbType.Int;

myParameter.Direction = ParameterDirection.ReturnValue;

myCommand.Parameters.Add(myParameter);

int i = 0; // 创建各个参数,在这个地方可以自动的创建SqlParameter的类型,值,方向等属性

while(reader.Read())

{

myParameter = new SqlParameter();

myParameter.ParameterName = reader["PARAMETER_NAME"].ToString();

myParameter.Direction = reader["PARAMETER_MODE"].ToString()=="IN"?ParameterDirection.Input:ParameterDirection.Output;

switch(reader["DATA_TYPE"].ToString()) {

case "int" :

if(myParameter.Direction == ParameterDirection.Input)

myParameter.Value = (int)parameters[i];

myParameter.SqlDbType = SqlDbType.Int;

break; //...省略了很多具体的类型处理

default : break; }

i ;

myCommand.Parameters.Add(myParameter);

}

}
3.2返回结果数据集、返回值、传出参数集
创建好存储过程的参数之后,我们就可以调用这个存储过程了。由于在.NET中,常用的返回结果集的类为SqlDataReader和DataSet,而SqlDataReader必须在保持连接的状态下才可以使用,DataSet却不需要。在我们的实现中,连接应该在调用之后就断开,因此采用DataSet来保存返回结果集。


public SqlResult Call(params object[] parameters){ // SqlResult是自己定义的用于保存结果数据集、返回值、传出参数集的类 SqlResult result = new SqlResult(); // 根据需要定义自己的连接字符串

myConnection = new SqlConnection(ConnectionString);

myCommand = new SqlCommand(this.ProcedureName, myConnection);

myCommand.CommandType = CommandType.StoredProcedure;

SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);

myConnection.Open(); // 获得和创建存储过程的参数,并且设置好值

GetProcedureParameter(parameters);

myAdapter.Fill(result.dataSet, "Table"); // 获得存储过程的传出参数值和名字对,保存在一个Hashtable中 GetOutputValue(result); // 在这里释放各种资源,断开连接

myAdapter.Dispose();

myCommand.Dispose();

myConnection.Close();

myConnection.Dispose();

return result;}
4.进一步工作
虽然我们在这里的实现是针对SQL Server数据库,但是对于任何提供了信息结构视图,符合ANSI-92标准,或者是提供了元数据的数据库都可以使用这种方法来实现。我们把它封装成一个SqlProcedure类,在需要的时候可以很简单的就调用了存储过程,减少了大量基本上是重复的代码工作。 为了让SqlProcedure类支持更过的数据类型,在GetProcedureParameter()方法中需要根据自己的需要来分析各个参数的类型、方向、长度、默认值等信息,然后来创建这个参数。基本上任何类型都是能够实现的,甚至连image类型都可以采用这种方式创建。这样这个类就可以很通用,在任何项目中都可以发挥作用。

参考文献
[1] Ray Rankins, Paul Jensen, Paul Bertucci,SQL Server 2000实用全书,北京:电子工业出版社,2002
[2] MSDN Library January 2003, Microsoft Corporation.

作者简介:刘志波(1979-),男,湖南新化人,硕士,主要研究方向:神经网络与模式识别,办公自动化信息系统
email:jasper_liu@msn.com

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!