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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C是一种面向过程的编程语言,于1972年由美国贝尔实验室的丹尼斯·里奇(Dennis Ritchie)发明。最初是为了设计和开发UNIX操作系统而创建的。C语言具有高效、简洁、灵活等特点,成为了广泛使用的编程语言之一。 C语言拥有丰富的语法和各种功能,可以方便地进行底层的计算机编程。它提供了基本的控制结构,如循环、条件语句和分支语句,使编程过程更灵活和可控。此外,C语言还支持函数和指针的使用,这使得程序员能够编写出高效、可重用的代码。 C语言在计算机领域有广泛的应用。它被用于开发操作系统、编译器、网络设备、嵌入式设备等重要的系统软件和硬件。C语言还可以用于编写各种应用程序,如数据库系统、图形界面、游戏等。许多编程语言和软件都是基于C语言的。 C语言的学习曲线相对较陡峭,需要掌握较多的语法规则和编程概念。但一旦掌握了C语言的核心概念和基本技能,将可以更好地理解和应用其他高级编程语言。 在编写程序时,C语言要求程序员有良好的逻辑思维和问题解决能力。它注重程序的效率和可维护性,在开发大型项目时能够更好地处理复杂的逻辑问题。 总之,C语言是一种值得学习和掌握的编程语言。它具有广泛的应用领域和丰富的功能,不仅可以帮助开发者更好地理解计算机底层,还能够编写高效和可重用的程序。无论是学习编程的初学者,还是专业的程序员,都可以从中受益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值