@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. BindException 无法指定被请求的地址

    Caused by: java.net.BindException: Problem binding to [hadoop3:8096] java.net.BindException: 无法指定被请求 ...

  2. CRM IFD 部署在同一台服务器上遇到的错误

    为了学习Dynamics 365,在阿里去上部署一台Dynamics 365服务器.然后实现了IFD 部署.学习的路线还之前的CRM 版本大致一样,这里只是记录一下我遇到的问题及解决问题的思路. 学习 ...

  3. mongo11---Access control is not enabled for the database

    今天使用MongoDB时遇到了一些问题 建立数据库连接时出现了warnings 出现这个警告的原因是新版本的MongDB为了让我们创建一个安全的数据库 必须要进行验证 后来在外网找到了答案 解决方案如 ...

  4. POJ1182 食物链 —— 种类并查集

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  5. YTU 2574: 空白格式化

    2574: 空白格式化 时间限制: 1 Sec  内存限制: 128 MB 提交: 233  解决: 118 题目描述 恭喜你进入了蓝桥杯总决赛,本次大赛采用了全自动机器测评系统. 如果你的答案与标准 ...

  6. Mediaproxy 与 Rtpproxy

    Mediaproxy: Mediaproxy是Opensips的一个模块,它用来实现现有大多数sip客户端的自动NAT穿透.这就意味着,当使用mediaproxy模块时,不需要对NAT盒子进行任何配置 ...

  7. String 对象

    1 你使用位置(索引)可以访问字符串中任何的字符: var str="this is a demo"; alert(str[3])//    s 字符串的索引从零开始, 所以字符串 ...

  8. Log4j日志等级

    Log4j根据日志信息的重要程度,分OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 当然再细分的话 还有 FATAL(严重错误), 但是Log4j官方建议实际实用的话,Log4 ...

  9. bzoj 2508: 简单题【拉格朗日乘数法】

    大概是对于f(x,y)求min,先把x看成常数,然后得到关于y的一元二次方程,然后取一元二次极值把y用x表示,再把x作为未知数带回去化简,最后能得到一个一元二次的式子,每次修改这个式子的参数即可. 智 ...

  10. 比特币搬砖对冲策略Python源码

    策略复制地址:https://www.fmz.com/strategy/21023 策略原理 比特币搬砖策略是入门程序化交易的基础策略.原理简单,是新手尝试程序化的好选择,在其黄金时期,比特币搬砖也带 ...