使用C#调用存储过程,用函数合理组织代码,使程序更加的清晰(示例)

虽然调用存储过程并不难实现,但是在程序中合理的组织代码,能使得程序结构更加的明晰,也更加易于维护。

下面的示例将存储过程的调用分为三部分:

1、为调用存储过程准备各种数据:数据库连接字符串、存储过程参数

2、为执行命令准备参数,使用1中的各种数据,建立与数据库的连接,为存储过程的调用准备好参变量和设置变量

3、执行存储过程,如查询操作或更新操作

示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace 使用存储过程
{
    class Program
    {
        //配置连接字符串
        public static string ConnString = @"Data Source=Q-PC\SQLEXPRESS;Integrated Security=SSPI;uid=sa;pwd=;Initial Catalog=hangyun";
        static void Main(string[] args)
        {
            Program p = new Program();

            SqlParameter[] parms = new SqlParameter[] //为存储过程配置参数
            { 
                new SqlParameter("@parms0",SqlDbType.NVarChar),
                new SqlParameter("@parms1",SqlDbType.NVarChar),
                                   .
                                   .
                                   .
                                   .
            };
            //为参数赋值
            parms[0].Value=需要传入存储过程中的值
            parms[1].Value=
            parms[2].Value=
                  .
                  .
                  .
                  .

            p.ExcStoreNonQuery(CommandType.StoredProcedure, "QHC_DomesticCompanyManage", parms);
            Console.ReadLine();
        }

        #region 存储过程执行更新
        ///<summary>
        ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
        /// 使用参数数组形式提供参数列表 
        /// </summary>
        /// <remarks>
        /// 使用示例:
        ///  int result = ExcStoreNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数据值表示此SqlCommand命令执行后影响的行数</returns>
        public int ExcStoreNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(ConnString);
            try
            {
                //通过PrePareCommand方法将参数逐个传入到SqlCommand的参数集合中
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                //清空SqlCommand中的参数列表
                cmd.Parameters.Clear();
                return val;
            }
            catch (Exception e)
            {
                throw new Exception("执行任务失败:" + e.Message + "   " + cmdText);

            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn = null;
            }
        }
        #endregion

        #region 存储过程执行查询
        /// <summary>
        /// 执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接
        /// 使用参数数组提供参数
        /// </summary>
        /// <remarks>
        /// 使用示例:
        /// DataTable table=StoreGetTable(conn,CommandType.StoredProcedure,"PublishOrders");
        /// </remarks>
        /// <param name="connecttionString">一个现有的数据库连接</param>
        /// <param name="cmdTye">SqlCommand命令类型</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <returns>返回一个表(DataTable)表示查询得到的数据集</returns>
        public DataTable StroreGetTable(CommandType cmdTye, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            DataTable ds = new DataTable();
            SqlConnection conn = new SqlConnection(ConnString);
            try
            {
                PrepareCommand(cmd, conn, null, cmdTye, cmdText, commandParameters);
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                adapter.Fill(ds);
                //返回一个表集
                return ds;
            }
            catch (Exception e)
            {
                throw new Exception("执行任务失败:" + e.Message + "   " + cmdText);

            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn = null;
            }
        }
        #endregion

        #region 为执行命令准备参数
        ///<summary>
        ///为执行命令准备参数
        ///</summary>
        ///<param name="cmd">Sqlcommang命令</param>
        ///<param name="conn">已经存在的数据库连接</param>
        ///<param name="trans">数据库事物处理</param>
        ///<param name="cmdType">SqlCommand命令类型(存储过程,T-Sql语句,等等。)</param>
        ///<param name="cmdText">Command text,T-Sql语句,例如:Select * from sufei</param>
        ///<param name="cmdParms">返回带参数的命令</param>
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {
            //判断数据库连接状态
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            //判断是否需要事物处理
            if (trans != null)
            {
                cmd.Transaction = trans;
            }

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
        #endregion
    }
}turnValue Output 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值