C#运用存储过程新增一条记录并返回自动生成的ID
@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类
- using System;
- namespace Model
- {
- ///
- /// shuju:实体类(属性说明自动提取数据库字段的描述信息)
- ///
- [Serializable]
- public partial class usersModel
- {
- public usersModel()
- { }
- #region Model
- private string _nc_uid;
- private string _nvc_username;
- private string _nvc_password;
- ///
- /// 用户id(Primary Key)
- ///
- public string nc_uid
- {
- set { _nc_uid = value; }
- get { return _nc_uid }
- }
- ///
- /// 用户名
- ///
- public string nvc_username
- {
- set { _nvc_username =value; }
- get { return_nvc_username; }
- }
- ///
- /// 密码
- ///
- public string nvc_password
- {
- set { _nvc_password =value; }
- get { return_nvc_password; }
- }
- #endregion Model
- }
- }
2.DAL类
- using System;
- using System.Data;
- using System.Text;
- using System.Data.SqlClient;
- using DBUtility;
- using Model;
- namespace DAL
- {
- ///
- /// 数据访问类:users
- ///
- public partial class usersDAL
- {
- public usersDAL()
- {}
- ///
- /// 新增一条记录 执行存储过程
- ///
- /// Model
- ///id
- public stringAddByProcedure(usersModel model)
- {
- string uid = null;
- IDataParameter[]parameters = {
- newSqlParameter("@nc_uid", SqlDbType.NChar,20),
- newSqlParameter("@nvc_username", SqlDbType.NVarChar,50),
- newSqlParameter("@nvc_password", SqlDbType.NVarChar,50)};
- parameters[0].Direction= ParameterDirection.Output;//注意这里
- parameters[1].Value =model.nvc_username;
- parameters[2].Value =model.nvc_password;
- uid =DbHelperSQL.RunProcedure("sp_users_Add ", "@nc_uid",parameters).ToString();
- return uid;
- }
- }
- }
3.DbHelperSQL类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.SqlClient;
- using System.Data;
- using System.Collections;
- namespace DBUtility
- {
- ///
- /// 数据访问抽象基础类
- ///
- public abstract class DbHelperSQL
- {
- //数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现.
- public static stringconnectionString = PubConstant.ConnectionString;
- public DbHelperSQL(){}
- ///
- ///执行存储过程,返回Output输出参数值
- ///
- /// 存储过程名
- /// 要返回值的参数名
- /// 存储过程参数
- ///string
- public static object RunProcedure(stringstoredProcName, string output, IDataParameter[] paramenters)
- {
- using (SqlConnectionconnection = new SqlConnection(connectionString))
- {
- connection.Open();
- SqlCommand command = BuildQueryCommand(connection,storedProcName, paramenters);
- //记录条数
- command.ExecuteNonQuery();
- //output和具体的存储程参数对应
- object obj =command.Parameters[output].Value.ToString(); if ((Object.Equals(obj, null))|| (Object.Equals(obj, System.DBNull.Value)))
- {
- return null;
- }
- else
- {
- return obj;
- }
- }
- }
- ///
- /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
- ///
- /// 数据库连接
- /// 存储过程名
- /// 存储过程参数
- ///SqlCommand
- private static SqlCommandBuildQueryCommand(SqlConnection connection, string storedProcName,IDataParameter[] parameters)
- {
- SqlCommand command = newSqlCommand(storedProcName, connection);
- command.CommandType =CommandType.StoredProcedure;
- foreach (SqlParameterparameter in parameters)
- {
- if (parameter !=null)
- {
- // 检查未分配值的输出参数,将其分配以DBNull.Value.
- if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction== ParameterDirection.Input) &&
- (parameter.Value == null))
- {
- parameter.Value = DBNull.Value;
- }
- command.Parameters.Add(parameter);
- }
- }
- return command;
- }
- }
- }
C#运用存储过程新增一条记录并返回自动生成的ID的更多相关文章
- sql server中新增一条数据后返回该数据的ID
开发中遇到的问题:在新增一条数据后往往不需要返回该数据的ID,但是有的时候可能需要返回该数据的ID以便后面的编程使用. 在这里介绍两种方法: 其一:使用存储过程: create procedure a ...
- sql 中实现往表中插入一条记录并返回当前记录的ID
写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...
- mysql insert一条记录后 返回创建记录主键id的方法
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- insert 一条数据 然后拿出这条数据在数据库中生成的ID
[insert 一条数据 然后拿出这条数据在数据库中生成的ID] <insert id="insert" parameterType="management&quo ...
- 【DB2】判断连续时间,如果间断则新增一条记录
需求描述 例如:产品A01 2017-01-02到2017-01-03产品状态都是差,那么就是一条记录 但是在2017-01-04这天的状态不是差,到了5日这天又是差了 就是另外一条记录了 需求处理 ...
- oracle中如何只查询一条复合条件的记录,即查到一条记录就返回(转)
可以用rownum来查询一条记录. 如emp表中有如下数据. 要求查询deptno为20的,但只取一条记录,可用如下语句: select * from emp where deptno=20 and ...
- 【SQL】sql语句在insert一条记录后返回该记录的ID
insert into test(name,age) values(') SELECT @@IDENTITY test是表名 重点是这句SELECT @@IDENTITY
- 【2016.3.30项目技术记录】]VS2010自动生成MFC单文档框架程序的修改:去除属性框,在CViewTree类中添加鼠标单击响应
转自http://blog.csdn.net/yanfeiouc2009/archive/2010/06/07/5653360.aspx 手头上有个东西要用到单文档,由于想省事,直接用VS2010做了 ...
- JavaWeb学习记录(二十四)——获取插入数据后,自动生成的id值
public Integer insertObjects(final Goods entity) { // 定义sql语句 final String sql1 = "inser ...
随机推荐
- myeclipse.hbm.xml自动生成
第一,你的项目是否搭建了hibernate框架? 第二,你是否建立了相应的数据表: 第三,做好前两步,你再把myeclipse和数据库连接起来,在相应的表上点击右键,生成hibernate 关联文件就 ...
- Hibernate 之 Why?
本文主要是从一个宏观的角度来认识Hibernate,对为什么用Hibernate进行一些说明,通过指导并了解Hibernate的特性及其优缺点可以让我们在以后的项目中根据具体的情况进行选择. Hibe ...
- 5.eclipse 自带的jdk没有源码,改了它
其实JDK源码在安装的时候已经放在了jdk所在的目录下,只是eclipse使用 了不带有源码的jre,导致没找到对应的源码,点击 Window->Perference->Java-> ...
- Violet蒲公英
传送门 题目要求求出给定区间内编号最小的众数,强制在线. 虽然说这是个黑题……不过我们可以用暴力分块解决它.首先先对所有数离散化,这个不影响众数.我们先预处理出每个数在前i个块内出现了多少次,再预处理 ...
- 洛谷P3778 [APIO2017]商旅——01分数规划
题目:https://www.luogu.org/problemnew/show/P3778 转化有点技巧: 其实直接关注比率的上下两项,也就是盈利和时间: 通过暴枚和 floyd 可以处理出两两点间 ...
- 【411】COMP9024 Assignment1 问题汇总
1. 构建 Makefile 文件后运行错误,undefined reference to 'sqrt' 实际上是没有链接math数学库,所以要 $gcc test.c –lm //-lm就是链接到m ...
- 关于Lucene全文检索相关技术
Lucene技术专门解决海量数据下的模糊搜索问题. Lucene主要完成的是数据预处理.建立倒排索引,及搜索.排名.高亮显示等功能 全文检索相关词语概要: 单词和文档矩阵: 文档(Document): ...
- json 获取属性值
ajax后台获取json数据 前台赋值.由于值太多 一个个写 val会类似的.因为直接字段值和 前台的标签id相同,这样只要循环结果集json赋值即可. 这里需要用到json的字段值 var data ...
- MySQL之不得不说的keepsync和trysync
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 开宗明义,keepsync和trysync是网易MySQL分支版本InnoSQL的两个参数,非常重要的两个参 ...
- CF896C Willem, Chtholly and Seniorious(珂朵莉树)
中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...