1. 程式人生 > >C#運用儲存過程新增一條記錄並返回自動生成的ID

C#運用儲存過程新增一條記錄並返回自動生成的ID

前言:

1、儲存過的好處:

儲存過程相對於其他的資料庫訪問方法有以下的優點:

(1)重複使用。儲存過程可以重複使用,從而可以減少資料庫開發人員的工作量。

(2)提高效能。儲存過程在建立的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用儲存過程提高了效率。

(3)減少網路流量。儲存過程位於伺服器上,呼叫的時候只需要傳遞儲存過程的名稱以及引數就可以了,因此降低了網路傳輸的資料量。

(4)安全性。引數化的儲存過程可以防止SQL注入式的攻擊。

2、儲存過程知識拓展:

(1)儲存過程共分為3類:

  A.返回記錄集的儲存過程。其執行結果是一個記錄集,例如:從資料庫中檢索出符合某一個或幾個條件的記錄

  B.返回數值的儲存過程(也可以稱為標量儲存過程)。其執行完以後返回一個值,例如:在資料庫中執行一個有返回值的函式或命令

  C.行為儲存過程。用來實現資料庫的某個功能,而沒有返回值,例如:在資料庫中的更新和刪除操作

 (2)含有return的儲存過程其返回值為return返回的那個值。

 (3)沒有return的儲存過程,不論執行結果有無記錄集,其返回值是0。

 (4)帶輸出引數的儲存過程:假如有return則返回return返回的那個值,假如要select輸出引數,則出現輸出引數的值,於有無return無關。

3、需求:

有的時候,我們可能需要得到由儲存過程自動生成的ID,那麼下面我將詳細介紹。

一、資料設計

1.資料表設計如下表(表名為users):

欄位名

欄位型別

是否為null

欄位預設值

備註

nc_uid

nchar(20)

×

使用者ID(Primary Key)

nvc_username

nvarchar(50)

×

使用者名稱

nvc_password

nvarchar(50)

×

密碼

2.儲存過程如下:

二、後臺

1.model類

using System;
namespace Model
{
    /// <summary>
    /// shuju:實體類(屬性說明自動提取資料庫欄位的描述資訊)
    /// </summary>
    [Serializable]
    public partial class usersModel
    {
        public usersModel()
        { }
        #region Model
        private string _nc_uid;
        private string _nvc_username;
        private string _nvc_password;
        /// <summary>
        /// 使用者id(Primary Key)
        /// </summary>
        public string nc_uid
        {
            set { _nc_uid = value; }
            get { return _nc_uid }
        }
        /// <summary>
        /// 使用者名稱
        /// </summary>
        public string nvc_username
        {
            set { _nvc_username =value; }
            get { return_nvc_username; }
        }
        /// <summary>
        /// 密碼
        /// </summary>
        public string nvc_password
        {
            set { _nvc_password =value; }
            get { return_nvc_password; }
        }
        #endregion Model
    }
}


2.DAL類

using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using DBUtility;
using Model;
namespace DAL
{
       /// <summary>
       /// 資料訪問類:users
       /// </summary>
       public partial class usersDAL
       {
              public usersDAL()
              {}
        /// <summary>
        /// 新增一條記錄  執行儲存過程
        /// </summary>
        /// <paramname="model">Model</param>
        ///<returns>id</returns>
        public stringAddByProcedure(usersModel model)
        {
            string uid = null;
            IDataParameter[]parameters = {
                                   newSqlParameter("@nc_uid", SqlDbType.NChar,20),
                                   newSqlParameter("@nvc_username", SqlDbType.NVarChar,50),
                                   newSqlParameter("@nvc_password", SqlDbType.NVarChar,50)};
            parameters[0].Direction= ParameterDirection.Output;//注意這裡
            parameters[1].Value =model.nvc_username;
            parameters[2].Value =model.nvc_password;
 
            uid =DbHelperSQL.RunProcedure("sp_users_Add ", "@nc_uid",parameters).ToString();
            return uid;
        }
       }
}


3.DbHelperSQL類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
 
namespace DBUtility
{
    /// <summary>
    /// 資料訪問抽象基礎類
    /// </summary>
    public abstract class DbHelperSQL
    {
        //資料庫連線字串(web.config來配置),多資料庫可使用DbHelperSQLP來實現.
        public static stringconnectionString = PubConstant.ConnectionString;
       public DbHelperSQL(){}
       
               /// <summary>
        ///執行儲存過程,返回Output輸出引數值        
        /// </summary>
        /// <paramname="storedProcName">儲存過程名</param>
        /// <paramname="output">要返回值的引數名</param>
        /// <paramname="parameters">儲存過程引數</param>
        ///<returns>string</returns>
        public static object RunProcedure(stringstoredProcName, string output, IDataParameter[] paramenters)
        {
            using (SqlConnectionconnection = new SqlConnection(connectionString))
            {
                connection.Open();
                SqlCommand command = BuildQueryCommand(connection,storedProcName, paramenters);
                //記錄條數
command.ExecuteNonQuery();
//output和具體的儲存程引數對應
object obj =command.Parameters[output].Value.ToString();                if ((Object.Equals(obj, null))|| (Object.Equals(obj, System.DBNull.Value)))
                {
                    return null;
                }
                else
                {
                    return obj;
                }
            }
        }
 
        /// <summary>
        /// 構建 SqlCommand 物件(用來返回一個結果集,而不是一個整數值)
        /// </summary>
        /// <paramname="connection">資料庫連線</param>
        /// <paramname="storedProcName">儲存過程名</param>
        /// <paramname="parameters">儲存過程引數</param>
        ///<returns>SqlCommand</returns>
        private static SqlCommandBuildQueryCommand(SqlConnection connection, string storedProcName,IDataParameter[] parameters)
        {
            SqlCommand command = newSqlCommand(storedProcName, connection);
            command.CommandType =CommandType.StoredProcedure;
            foreach (SqlParameterparameter in parameters)
            {
                if (parameter !=null)
                {
                    // 檢查未分配值的輸出引數,將其分配以DBNull.Value.
                    if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction== ParameterDirection.Input) &&
                       (parameter.Value == null))
                    {
                       parameter.Value = DBNull.Value;
                    }
                    command.Parameters.Add(parameter);
                }
            }
            return command;
        }
    }
}