C#运用存储过程新增一条记录并返回自动生成的ID

时间:2022-01-31 18:12:28

前言:

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;
        }
    }
}