使用C#調用存儲過程,用函數合理組織代碼,使程序更加的清晰(示例)

jopen 9年前發布 | 1K 次閱讀 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   </pre> 


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!