您的位置:首页 > 编程语言 > C#

C#完整执行存储过程的代码加实例

2016-03-20 07:58 567 查看
using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Collections;

using System.Data;

namespace TestWindow

{
public class StoreProcedure

{

// 连接字符串。

private string connectionString;

// 存储过程名称。

private string storeProcedureName;
//// <summary>

/// 初始化 DataAccessHelper.StoreProceduer 对象。

/// </summary>

/// <param name="connectionString">数据库连接字符串。</param>
public StoreProcedure(string connectionString)

{

this.connectionString = connectionString;

}
//// <summary>

/// 初始化 DataAccessHelper.StoreProceduer 对象。

/// </summary>

/// <param name="connectionString">数据库连接字符串。</param>

/// <param name="storeProcedureName">存储过程名称。</param>

public StoreProcedure(string storeProcedureName, string connectionString)

{

this.connectionString = connectionString;

this.storeProcedureName = storeProcedureName;

}
//// <summary>

/// 获取或设置存储过程名称。

/// </summary>

public string StoreProcedureName

{

get { return this.storeProcedureName; }

set { this.storeProcedureName = value; }

}
//// <summary>

/// 执行操作类(Insert/Delete/Update)存储过程。

/// </summary>

/// <param name="paraValues">传递给存储过程的参数值列表。</param>

/// <returns>受影响的行数。</returns>

public int ExecuteNonQuery(params object[] paraValues)

{
using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);
try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

connection.Open();

int affectedRowsCount = command.ExecuteNonQuery();

return affectedRowsCount;

}

catch

{

throw;

}

}

}
//// <summary>

/// 执行存储过程,返回 System.Data.DataTable。

/// </summary>

/// <param name="paraValues">传递给存储过程的参数值列表。</param>

/// <returns>包含查询结果的 System.Data.DataTable。</returns>

public DataTable ExecuteDataTable(params object[] paraValues)

{
using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);
try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

SqlDataAdapter adapter = new SqlDataAdapter(command);

DataTable dataTable = new DataTable();

adapter.Fill(dataTable);

return dataTable;

}

catch

{

throw;

}

}

}
//// <summary>

/// 执行存储过程,填充指定的 System.Data.DataTable。

/// </summary>

/// <param name="dataTable">用于填充查询结果的 System.Data.DataTable。</param>

/// <param name="paraValues">传递给存储过程的参数值列表。</param>

public void ExecuteFillDataTable(DataTable dataTable, params object[] paraValues)

{
using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);
try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

connection.Open();

SqlDataAdapter adapter = new SqlDataAdapter(command);

adapter.Fill(dataTable);

}

catch

{

throw;

}

}

}
//// <summary>

/// 执行存储过程返回 System.Data.SqlClient.SqlDataReader,

/// 在 System.Data.SqlClient.SqlDataReader 对象关闭时,数据库连接自动关闭。

/// </summary>

/// <param name="paraValues">传递给存储过程的参数值列表。</param>

/// <returns>包含查询结果的 System.Data.SqlClient.SqlDataReader 对象。</returns>

public SqlDataReader ExecuteDataReader(params object[] paraValues)

{
using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);
try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

connection.Open();

return command.ExecuteReader(CommandBehavior.CloseConnection);

}

catch

{

throw;

}

}

}
//// <summary>

/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。

/// </summary>

/// <param name="paraValues">传递给存储过程的参数值列表。</param>

/// <returns>结果集中第一行的第一列或空引用(如果结果集为空)。</returns>

public object ExecuteScalar(params object[] paraValues)

{
using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);
try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

connection.Open();

object result = command.ExecuteScalar();

//string r = command.Parameters[1].Value.ToString();

return result;

}

catch

{

throw;

}

}

}
//// <summary>

/// 从在 System.Data.SqlClient.SqlCommand 中指定的存储过程中检索参数信息并填充指定的

/// System.Data.SqlClient.SqlCommand 对象的 System.Data.SqlClient.SqlCommand.Parameters 集 合。

/// </summary>

/// <param name="sqlCommand">将从其中导出参数信息的存储过程的 System.Data.SqlClient.SqlCommand 对象。</param>

internal void DeriveParameters(SqlCommand sqlCommand)

{

try

{

sqlCommand.Connection.Open();

SqlCommandBuilder.DeriveParameters(sqlCommand);

sqlCommand.Connection.Close();

}

catch

{

if (sqlCommand.Connection != null)

{

sqlCommand.Connection.Close();

}

throw;

}

}
// 用指定的参数值列表为存储过程参数赋值。

private void AssignParameterValues(SqlCommand sqlCommand, params object[] paraValues)

{

if (paraValues != null)

{

if ((sqlCommand.Parameters.Count - 1) != paraValues.Length)

{

throw new ArgumentNullException("The number of parameters does not match number of values for stored procedure.");

}

for (int i = 0; i < paraValues.Length; i++)

{

sqlCommand.Parameters[i + 1].Value = (paraValues[i] == null) ? DBNull.Value : paraValues[i];

}

}

}
// 创建用于执行存储过程的 SqlCommand。

private SqlCommand CreateSqlCommand(SqlConnection connection)

{
SqlCommand command = new SqlCommand(this.storeProcedureName, connection);

command.CommandType = CommandType.StoredProcedure;
return command;

}
//-------------------------------------这一部分是我完善的,因为没有执行后返回存储过程中的返回值的函数-----------------------
/// <summary>

/// 执行存储过程,返回存储过程定义的返回值,注意存储过程中参数(paraValues)如果为返回值赋为空,其它值位置对应好

/// </summary>

/// <param name="output">返回存储过程中定义的返回值数组</param>

/// <param name="outParaNum">存储过程中返回值的个数</param>

/// <param name="paraValues">存储过程全部参数值</param>

public void ExecProcOutput(out object[] output, int outParaNum, params object[] paraValues)

{

using (SqlConnection connection = new SqlConnection(this.connectionString))

{
SqlCommand command = this.CreateSqlCommand(connection);

output = new object[outParaNum];//存储过程中返回值的个数

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command, paraValues);

connection.Open();

command.ExecuteNonQuery();

for (int i = 0; i < outParaNum; i++)//将存储过程返回的参数值返回到程序中

{

output[i] = command.Parameters[1].Value;

}

}

catch

{

throw;

}

}

}

}

}
调用实例:
网上也没有个具体的调用实例,我这里加一个大家参考

存储过程:使用student数据库,数据很简单自己去看就可以了
创建存储过程:第一个是有返回值的,第二个是普通查询
if exists(select name from sysobjects where name='checkUserName' and type='p')

drop proc checkUserName

go

create proc checkUserName

(@checkResult int output,

@userName varchar(20),

@userID varchar(20))

as

if exists(select * from student_table where sname=@userName and studentID=@userID)

set @checkResult=1 --通过验证

else if exists(select * from student_table where sname=@userName)

set @checkResult=2 --用户密码错误

else

set @checkResult=0 --用户不存在

return isNull(@checkResult,2)

go
--以下是执行第一个存储过程在sql server 2005中

declare @checkResult int --声明一个返回值的变量

exec checkUserName @checkResult output,'g','123' --执行

select case @checkResult --select
   when 1 then '成功'

   when 0 then '不存在'

  when 2 then '密码不正确'

  end as '验证结果'
--第二个存储过程,普通查询
use student

if exists(select * from sysobjects where type='p' and name='studentProc')

drop proc studentProc

go

create proc studentProc

(@studentName varchar(20),

@studentID varchar(20))

as

select * from student_table where sname=@studentName and studentID=@studentID

--执行存储过程
go
exec studentProc 'g','123'
--------------------以下是在C# vs 2005中使用上面我面定义的类来执行存储过程------------
界面,很简单就是测试



private void button1_Click(object sender, EventArgs e)

{

SqlConnection conn = new SqlConnection(connString);

SqlCommand cmd = new SqlCommand();
//---------注释部分是我普通的执行存储过程的语句,很繁琐吧...

//cmd.Connection = conn;

//conn.Open();

//cmd.CommandText = "checkUserName";

//cmd.CommandType = CommandType.StoredProcedure;

//cmd.Parameters.Add("@userName", SqlDbType.VarChar);

//cmd.Parameters["@userName"].Value = this.textBox1.Text.Trim();

//cmd.Parameters.Add("@userID", SqlDbType.VarChar);

//cmd.Parameters["@userID"].Value = this.textBox2.Text.Trim();

//cmd.Parameters.Add("@checkResult", SqlDbType.Int);

//cmd.Parameters["@checkResult"].Direction = ParameterDirection.Output;

//cmd.ExecuteNonQuery();studentProc
//---------使用执行存储过程帮手的类来完成.........简单啊!

StoreProcedure sp = new StoreProcedure("checkUserName", connString);//类的对象

Object[] paraValues = new object[3];//注意,这里是存储过程中全部的参数,一共有三个,还要注意顺序啊,返回值是第一个,那么赋值时第一个参数就为空

paraValues[1] = this.textBox1.Text.Trim();//从第二个参数开始赋值

paraValues[2] = this.textBox2.Text.Trim();

object[] output注意,这里是用来保存,存储过程中定义的返回值
sp.ExecProcOutput(out output,1, paraValues);//调用我们前面定义的方法,这里我就随便写了一个,能完成功能,大家改进

//object o = sp.ExecuteScalar(paraValues);//这个是查询的那个存储过程调用,很简单,不多说了

//---------下面就是验证了...看看,这样做是不是很简单的执行了存储过程.....

switch (Convert.ToInt32(output[0]))

{

case 0:

this.label4.Text = "用户不存在";

break;

case 1:

this.label4.Text = "登录成功";

break;

case 2:

this.label4.Text = "密码不正确";

break;

default:

break;

}

}
好了..就到这里...我这也是看贴子做完写点感受..也增加自己的印象.............积累中..............

Email:gaojun_le@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: