@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. Ubuntu grub2的启动配置文件grub.cfg,为了修改另人生厌的时间

    文章转自http://hi.baidu.com/detax/blog/item/90f18b54a8ef5253d00906e4.html 升级到Ubuntu 9.10后,就要接触grub2了,它和以 ...

  2. select case when if

    select case when if 的一些用法 - 马丁传奇 - 博客园 https://www.cnblogs.com/martinzhang/p/3220595.html Write a SQ ...

  3. WEB 字体

    之前如果想在自己的网站使用某些好看的字体,总是迫不得已得在PS里先把字体图片做好.虽然这样做也能达到我们想要的效果,但是这样就增加了HTTP请求 (如果在多处使用的话),即使合并所有图片,也不好管理, ...

  4. CXF Spring 使用

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. 高负载linux调优

    调整Linux内核参数: # vi /etc/sysctl.conf# tells the Kernel it's ok if services bind to non-existant IP ADD ...

  6. VS2012变化的快捷键

    VS2012变化的快捷键: 注释::VS2010是(Ctrl+E,C),VS2012是(Ctrl+K, Ctrl+C),实际操作,按住Ctrl键不放,先按K键,再按C键.相当于Ctrl+K加 Ctrl ...

  7. RK3288-OTA编译失败解决办法【转】

    本文转载自:http://blog.csdn.net/wangxueming/article/details/52448630 在执行make  otapackage的时候出现该错误,是由于drmsi ...

  8. 【TJOI 2014】 上升子序列

    [题目链接] 点击打开链接 [算法] 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i] ...

  9. 【SCOI 2005】 繁忙的都市

    [题目链接] 点击打开链接 [算法] 题目描述比较繁琐,但细心观察后,发现其实就是用kruskal算法求最小生成树 [代码] #include<bits/stdc++.h> using n ...

  10. 【转】jenkins上配置robotframeworkride自动化脚本任务

    jenkins上配置robotframeworkride自动化脚本任务 编写好的自动化脚本,集成在jenkins上进行自动运行于监控,这里采用分布式构建,在一台slave上进行任务构建与自动化脚本的运 ...