| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
10年前发布

使用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