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

时间:2021-10-21 01:28:41

@Hcy黄灿奕:http://blog.sina.com.cn/iihcy

前言:

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类

 

[csharp] view plaincopy 
  1. using System;  
  2. namespace Model  
  3. {  
  4.     ///   
  5.     /// shuju:实体类(属性说明自动提取数据库字段的描述信息)  
  6.     ///   
  7.     [Serializable]  
  8.     public partial class usersModel  
  9.     {  
  10.         public usersModel()  
  11.         { }  
  12.         #region Model  
  13.         private string _nc_uid;  
  14.         private string _nvc_username;  
  15.         private string _nvc_password;  
  16.         ///   
  17.         /// 用户id(Primary Key)  
  18.         ///   
  19.         public string nc_uid  
  20.         {  
  21.             set { _nc_uid = value; }  
  22.             get { return _nc_uid }  
  23.         }  
  24.         ///   
  25.         /// 用户名  
  26.         ///   
  27.         public string nvc_username  
  28.         {  
  29.             set { _nvc_username =value; }  
  30.             get { return_nvc_username; }  
  31.         }  
  32.         ///   
  33.         /// 密码  
  34.         ///   
  35.         public string nvc_password  
  36.         {  
  37.             set { _nvc_password =value; }  
  38.             get { return_nvc_password; }  
  39.         }  
  40.         #endregion Model  
  41.     }  
  42. }  



 

2.DAL类

 

[csharp] view plaincopy 
  1. using System;  
  2. using System.Data;  
  3. using System.Text;  
  4. using System.Data.SqlClient;  
  5. using DBUtility;  
  6. using Model;  
  7. namespace DAL  
  8. {  
  9.        ///   
  10.        /// 数据访问类:users  
  11.        ///   
  12.        public partial class usersDAL  
  13.        {  
  14.               public usersDAL()  
  15.               {}  
  16.         ///   
  17.         /// 新增一条记录  执行存储过程  
  18.         ///   
  19.         /// Model  
  20.         ///id  
  21.         public stringAddByProcedure(usersModel model)  
  22.         {  
  23.             string uid = null;  
  24.             IDataParameter[]parameters = {  
  25.                                    newSqlParameter("@nc_uid", SqlDbType.NChar,20),  
  26.                                    newSqlParameter("@nvc_username", SqlDbType.NVarChar,50),  
  27.                                    newSqlParameter("@nvc_password", SqlDbType.NVarChar,50)};  
  28.             parameters[0].Direction= ParameterDirection.Output;//注意这里  
  29.             parameters[1].Value =model.nvc_username;  
  30.             parameters[2].Value =model.nvc_password;  
  31.    
  32.             uid =DbHelperSQL.RunProcedure("sp_users_Add ", "@nc_uid",parameters).ToString();  
  33.             return uid;  
  34.         }  
  35.        }  
  36. }  



 

3.DbHelperSQL类

 

[csharp] view plaincopy 
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using System.Data.SqlClient;  
    6. using System.Data;  
    7. using System.Collections;  
    8.    
    9. namespace DBUtility  
    10. {  
    11.     ///   
    12.     /// 数据访问抽象基础类  
    13.     ///   
    14.     public abstract class DbHelperSQL  
    15.     {  
    16.         //数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现.  
    17.         public static stringconnectionString = PubConstant.ConnectionString;  
    18.        public DbHelperSQL(){}  
    19.          
    20.                ///   
    21.         ///执行存储过程,返回Output输出参数值          
    22.         ///   
    23.         /// 存储过程名  
    24.         /// 要返回值的参数名  
    25.         /// 存储过程参数  
    26.         ///string  
    27.         public static object RunProcedure(stringstoredProcName, string output, IDataParameter[] paramenters)  
    28.         {  
    29.             using (SqlConnectionconnection = new SqlConnection(connectionString))  
    30.             {  
    31.                 connection.Open();  
    32.                 SqlCommand command = BuildQueryCommand(connection,storedProcName, paramenters);  
    33.                 //记录条数  
    34. command.ExecuteNonQuery();  
    35. //output和具体的存储程参数对应  
    36. object obj =command.Parameters[output].Value.ToString();                if ((Object.Equals(obj, null))|| (Object.Equals(obj, System.DBNull.Value)))  
    37.                 {  
    38.                     return null;  
    39.                 }  
    40.                 else  
    41.                 {  
    42.                     return obj;  
    43.                 }  
    44.             }  
    45.         }  
    46.    
    47.         ///   
    48.         /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)  
    49.         ///   
    50.         /// 数据库连接  
    51.         /// 存储过程名  
    52.         /// 存储过程参数  
    53.         ///SqlCommand  
    54.         private static SqlCommandBuildQueryCommand(SqlConnection connection, string storedProcName,IDataParameter[] parameters)  
    55.         {  
    56.             SqlCommand command = newSqlCommand(storedProcName, connection);  
    57.             command.CommandType =CommandType.StoredProcedure;  
    58.             foreach (SqlParameterparameter in parameters)  
    59.             {  
    60.                 if (parameter !=null)  
    61.                 {  
    62.                     // 检查未分配值的输出参数,将其分配以DBNull.Value.  
    63.                     if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction== ParameterDirection.Input) &&  
    64.                        (parameter.Value == null))  
    65.                     {  
    66.                        parameter.Value = DBNull.Value;  
    67.                     }  
    68.                     command.Parameters.Add(parameter);  
    69.                 }  
    70.             }  
    71.             return command;  
    72.         }  
    73.     }  
    74. }