@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. JAVA泛型类

    泛型是JDK 5.0后出现新概念,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. 泛型类引入的好处不 ...

  2. 云Hbase数据库在亿方云实践之路

    本文主要先介绍了亿方云,进而谈及了数据架构,着重分析了HBase实践等 2017云栖大会HBase专场,亿方云科技CTO 王成军带来HBase在亿方云客户端同步系统中的应用实践的演讲.本文主要先介绍了 ...

  3. reverse proxy and forward proxy

    1 什么是forward proxy 一句话,client的proxy就是forward proxy. 2 什么是reverse proxy 一句话,server的proxy就是reverse pro ...

  4. RDD变换

    对Key/Value型RDD进行变换 groupBy按Key汇聚 fruit,applevegetable,cucumberfruit,cherryvegetable,beanfruit,banana ...

  5. [Unity3D]Unity3D游戏开发之连续滚动背景

    在诸如天天跑酷等2D游戏中.因为游戏须要表现出运动的感觉.通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天.博主就来带领大家一起来实现连续滚动背景吧. 首先来讲述一下原理.准备两张连续的图片(博 ...

  6. Webdriver中关于driver.navigate().to()和driver.get()使用的区别

    先是有一个父页上button弹开一个子页,总共有4个子页,必须前一个页上的必填信息录完,才能在这个页面触发下一个子页. 用driver.navigate().to(baseUrl2),直接跳转到第2个 ...

  7. [Codeforces 507E] Breaking Good

    [题目链接] https://codeforces.com/contest/507/problem/E [算法] 首先BFS求出1到其余点的最短路 , N到其余点的最短路,记为distA[]和dist ...

  8. Memcache存储大数据的问题(大于1m)

    Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题. 我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql se ...

  9. VS2013插件开发

    一.功能描述 项目中有一个AppSettings.xml文件,当这个文件有添加新元素的时候,将该添加的内容自动同步到其他目录下的AppSettings.xml文件. 二.插件模板选择 要开发VS插件需 ...

  10. 《Spring Boot官方指南》(二)入门

    如果您刚开始接触Spring Boot,或者简称’Spring’, 这个部分对您来说非常有用.这个部分提供了“是什么?”,“怎么做?”和 “为什么?”的解释.您除了会阅读一份附带Spring Boot ...