@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. uid =DbHelperSQL.RunProcedure("sp_users_Add ", "@nc_uid",parameters).ToString();
  32. return uid;
  33. }
  34. }
  35. }

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

C#运用存储过程新增一条记录并返回自动生成的ID的更多相关文章

  1. sql server中新增一条数据后返回该数据的ID

    开发中遇到的问题:在新增一条数据后往往不需要返回该数据的ID,但是有的时候可能需要返回该数据的ID以便后面的编程使用. 在这里介绍两种方法: 其一:使用存储过程: create procedure a ...

  2. sql 中实现往表中插入一条记录并返回当前记录的ID

    写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...

  3. mysql insert一条记录后 返回创建记录主键id的方法

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  4. insert 一条数据 然后拿出这条数据在数据库中生成的ID

    [insert 一条数据 然后拿出这条数据在数据库中生成的ID] <insert id="insert" parameterType="management&quo ...

  5. 【DB2】判断连续时间,如果间断则新增一条记录

    需求描述 例如:产品A01 2017-01-02到2017-01-03产品状态都是差,那么就是一条记录 但是在2017-01-04这天的状态不是差,到了5日这天又是差了 就是另外一条记录了 需求处理 ...

  6. oracle中如何只查询一条复合条件的记录,即查到一条记录就返回(转)

    可以用rownum来查询一条记录. 如emp表中有如下数据. 要求查询deptno为20的,但只取一条记录,可用如下语句: select * from emp where deptno=20 and  ...

  7. 【SQL】sql语句在insert一条记录后返回该记录的ID

    insert into test(name,age) values(') SELECT @@IDENTITY test是表名 重点是这句SELECT @@IDENTITY

  8. 【2016.3.30项目技术记录】]VS2010自动生成MFC单文档框架程序的修改:去除属性框,在CViewTree类中添加鼠标单击响应

    转自http://blog.csdn.net/yanfeiouc2009/archive/2010/06/07/5653360.aspx 手头上有个东西要用到单文档,由于想省事,直接用VS2010做了 ...

  9. JavaWeb学习记录(二十四)——获取插入数据后,自动生成的id值

    public Integer insertObjects(final Goods entity) { // 定义sql语句        final String sql1 = "inser ...

随机推荐

  1. putty字体大小颜色、全屏/退出全屏快捷键 保存session设置[转]

    字体大小设置 Window->Appearance->Font settings->Change按钮设置(我的设置为16)字体为(Consolas) 字体颜色设置 Window-&g ...

  2. jvm部分知识总结

    1.jvm有三种执行模式,分别是解释执行,混合执行和编译执行,默认情况是混合执行模式. java version " Java(TM) SE Runtime Environment (bui ...

  3. get the default proxy by Powershell

    https://stackoverflow.com/questions/571429/powershell-web-requests-and-proxies $proxyAddr = (get-ite ...

  4. Masonry scrollview循环布局

    前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...

  5. 并不对劲的trie树

    听上去像是破坏植物的暴力行为(并不). 可以快速查询某个字符串在某个字符串集中出现了几次,而且听上去比字符串哈希靠谱. 把整个字符串集建成树,边权是字符,对于字符串结尾的节点进行特殊标记. 这样一方面 ...

  6. 单纯形 BZOJ3112: [Zjoi2013]防守战线

    题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...

  7. django flask缓存memcache的key生成方法介绍

    去年的一个django项目中,使用了memcache作为系统缓存,并实现多台机器上的缓存共享.配置的cache如下图所示: 最近在项目调试过程中,发现memcache在进行缓存时,使用的key并不是实 ...

  8. linux内存管理之uboot第一步

    在进入讲解linux内存管理的kernel阶段以前,了解一下uboot阶段是如何准备好内存物理设备的,这是非常有意义的.通常进入到linux内核阶段之后,对内存芯片的物理特性寄存器访问是比较少的,强调 ...

  9. STM32F4 DMA2D_R2M

    图像处理的专门DMA 看一段示例代码 /** * @brief Displays a line. * @param Xpos: specifies the X position. * @param Y ...

  10. bzoj 1863: [Zjoi2006]trouble 皇帝的烦恼【二分+dp】

    二分答案,注意l是max(a[i]+a[i+1]),r是sum_a 判断的时候用dp,设f[i]为i与1最少的相同颜色数,g[i]为i与1最多的相同颜色数,转移是f[i]=max(a[i]-(w-a[ ...