请好心人提供一个调用储存过程的方法
我不想每次都写重复的代码,各位能不能提供一个调用存储过程的方法,带参数的,sqlhelper不会用,谢谢了,最好给个例子
[解决办法]
如果你会用企业类库的话,那里面有很好的调用存储过成的方法
[解决办法]
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
// 摘要:数据访问助手。
// 作者:ZhiQiao
// 日期:2008/07/02
namespace ZhiQiao.DataAccessHelper
{
// 存储过程调用助手。
public class StoreProcedure
{
// 存储过程名称。
private string _name;
// 数据库连接字符串。
private string _conStr;
// 构造函数
// sprocName: 存储过程名称;
// conStr: 数据库连接字符串。
public StoreProcedure(string sprocName, string conStr) {
_conStr = conStr;
_name = sprocName;
}
// 执行存储过程,不返回值。
// paraValues: 参数值列表。
// return: void
public void ExecuteNoQuery(params object[] paraValues) {
using (SqlConnection con = new SqlConnection(_conStr)) {
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
comm.ExecuteNonQuery();
con.Close();
}
}
// 执行存储过程返回一个表。
// paraValues: 参数值列表。
// return: DataTable
public DataTable ExecuteDataTable(params object[] paraValues) {
SqlCommand comm = new SqlCommand(_name, new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
// 执行存储过程,返回SqlDataReader对象,
// 在SqlDataReader对象关闭的同时,数据库连接自动关闭。
// paraValues: 要传递给给存储过程的参数值类表。
// return: SqlDataReader
public SqlDataReader ExecuteDataReader(params object[] paraValues) {
SqlConnection con = new SqlConnection(_conStr);
SqlCommand comm = new SqlCommand(_name, con);
comm.CommandType = CommandType.StoredProcedure;
AddInParaValues(comm, paraValues);
con.Open();
return comm.ExecuteReader(CommandBehavior.CloseConnection);
}
// 获取存储过程的参数列表。
private ArrayList GetParas() {
SqlCommand comm = new SqlCommand("dbo.sp_sproc_columns_90",
new SqlConnection(_conStr));
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@procedure_name", (object)_name);
SqlDataAdapter sda = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
sda.Fill(dt);
ArrayList al = new ArrayList();
for (int i = 0; i < dt.Rows.Count; i++) {
al.Add(dt.Rows[i][3].ToString());
}
return al;
}
// 为 SqlCommand 添加参数及赋值。
private void AddInParaValues(SqlCommand comm, params object[] paraValues) {
comm.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
comm.Parameters["@RETURN_VALUE"].Direction =
ParameterDirection.ReturnValue;
if (paraValues != null) {
ArrayList al = GetParas();
for (int i = 0; i < paraValues.Length; i++) {
comm.Parameters.AddWithValue(al[i + 1].ToString(),
paraValues[i]);
}
}
}
}
}
[解决办法]
SqlParameter[] parms = new SqlParameter[] {
new SqlParameter("@Parm1", SqlDbType.Int),
new SqlParameter("@Parm2", SqlDbType.VarChar)
// ...
};
parms[0].Value = 911;
// ...
using (SqlDataReader dr = SqlHelper.ExecuteReader(MyConnectionString, CommandType.StoredProcedure, MyStoredProcedureName, parms))
{
while(dr.Read()){
string v = dr["FieldXXX"].ToString();
//...
}
}
[解决办法]
創建表products
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[products]GOCREATE TABLE [dbo].[products] ([productID] [int] IDENTITY (1, 1) NOT NULL ,[ProductName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,[ProductDetails] [varchar] (5000) COLLATE Chinese_PRC_CI_AS NOT NULL ,[ProImg] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]GO'--創建存儲過程 Add_ProductsCREATE procedure Add_Products(@ProName varchar(20),@ProImg varchar(30),@ProDetails varchar(3000))ASInsert into products values(@ProName,@ProImg,@ProDetails)GO
[解决办法]
要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接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);
这样就添加了一个输入参数。若需要添加输出参数:
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);
从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在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;