C#运用存储过程新增一条记录并返回自动生成的ID
来源:互联网 发布:c语言goto语句的用法 编辑:程序博客网 时间:2024/04/29 23:45
前言:
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{ /// <summary> /// shuju:实体类(属性说明自动提取数据库字段的描述信息) /// </summary> [Serializable] public partial class usersModel { public usersModel() { } #region Model private string _nc_uid; private string _nvc_username; private string _nvc_password; /// <summary> /// 用户id(Primary Key) /// </summary> public string nc_uid { set { _nc_uid = value; } get { return _nc_uid } } /// <summary> /// 用户名 /// </summary> public string nvc_username { set { _nvc_username =value; } get { return_nvc_username; } } /// <summary> /// 密码 /// </summary> 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{ /// <summary> /// 数据访问类:users /// </summary> public partial class usersDAL { public usersDAL() {} /// <summary> /// 新增一条记录 执行存储过程 /// </summary> /// <paramname="model">Model</param> ///<returns>id</returns> 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{ /// <summary> /// 数据访问抽象基础类 /// </summary> public abstract class DbHelperSQL { //数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现. public static stringconnectionString = PubConstant.ConnectionString; public DbHelperSQL(){} /// <summary> ///执行存储过程,返回Output输出参数值 /// </summary> /// <paramname="storedProcName">存储过程名</param> /// <paramname="output">要返回值的参数名</param> /// <paramname="parameters">存储过程参数</param> ///<returns>string</returns> 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; } } } /// <summary> /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值) /// </summary> /// <paramname="connection">数据库连接</param> /// <paramname="storedProcName">存储过程名</param> /// <paramname="parameters">存储过程参数</param> ///<returns>SqlCommand</returns> 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
- ibatis配置(mysql数据库) 新增一条记录后,返回自动增长的主键id
- 存储过程返回新增数据的主键id值
- oracle及mysql+mybatis新增一条记录并获取该记录的id
- 插入一条记录并返回当前的ID(自增的ID)
- 向表中插入一条记录并返回这条记录的id
- 使用SqlDataSource新增记录并返回自增ID
- C# 向数据库插入一条记录后,获得新插入记录的自动编号(id)
- nodejs+mysql 插入一条记录时获取自动生成的id
- mybatis插入一条记录如何返回该记录的ID
- java程序调用存储过程得到新增加记录的id号的方法
- Laravel 新增一条记录并且获取id
- ADO.NET 查询一条记录时,如何并查出上一条记录的ID,和下一条记录的ID
- Asp.NET 查询一条记录时,如何并查出上一条记录的ID,和下一条记录的ID
- 根据一定规则为数据表新增记录自动编号的存储过程
- sqlserver根据输入的两个点表中的ID号,插入一条线的记录到线表的存储过程
- 插入一条数据并返回ID
- sql生成(c#调用存储过程返回数据表)代码的存储过程
- 2-5. Friday: Mastering In-House Jargon
- HttpSession解析
- 3-1. Writing a Memorandum
- JAVA/Android 读写文件,避免中文乱码 FileWriter乱码 .
- 3-2. On the Phone
- C#运用存储过程新增一条记录并返回自动生成的ID
- 3-3. Sending a Fax
- Java 终止线程方法
- 3-4. Online Banking
- OpenGL初使用,glut库安装(vs2013)
- 【C#】在VS2012中连接MSSQL数据库
- JAVA基础——IO流
- 在页面上用action传递参数到后台乱码解决办法
- 做游戏开发必须会的抓包方法