@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. 构造json参数时key的引号和js string转json的三种方式

    {name:"dd",age:"16"} {"name":"dd","age":"16&q ...

  2. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  3. YTU 2436: C++ 习题 输出日期时间--友元类

    2436: C++ 习题 输出日期时间--友元类 时间限制: 1 Sec  内存限制: 128 MB 提交: 1243  解决: 690 题目描述 设计一个日期类和时间类,编写display函数用于显 ...

  4. JS数组array常用方法

    JS数组array常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2)获取对象的 ...

  5. 使用webBrowse把网页word等转换成图片

    http://blog.csdn.net/zgke/article/details/3248497 使用 Bitmap MyImage = Test.GetControlScrollImage(new ...

  6. Gerrit+apache+H2数据库简单安装配置及建库流程

    Gerrit 是一个基于 Web 的代码评审和项目管理的工具,面向基于 Git 版本控制系统的项目.因此需要Apache.Mysql.GIT等相关软件的支持 系统配置: 新装的UBANTU LINUX ...

  7. linux上部署javaWeb项目

    将web项目打成war包,上传到Linux操作系统tomcat安装目录下的webapps下即可!

  8. c语言和c++栈的简单实现以及构造器的原理

    也就是训练将原来的c语言 用类表示出来.. 关于构造器: //1与类名相同 没有返回值 被系统生成对象时自动调用,用于初始化 //2 可以有参数 构造器重载 默认参数 //3 重载和默认不能同时存在, ...

  9. Gym 100512B Betting Fast (题意+概率)

    题意:你开始有 s 元钱,然后你要在 t 场内赚到 n 元,每次赢的概率是 p,并且要越快越好. 析:当时没注意这个条件,要越快越好,然后写概率dp,怎么看也不像是对.其实是每次赌 min(s, n- ...

  10. Math对象常用方法(取整细节)

    Math 对象 Math 对象用于执行数学任务. 1.常用属性: 1.E :返回算术常量e,即自然对数的底数(约2.718) 2.PI :返回圆周率,约3.14159 2.常用方法    Math.方 ...