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

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

2013-09-16 10:07 716 查看
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;

            }

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