C#运用存储过程新增一条记录并返回自动生成的ID
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
C#运用存储过程新增一条记录并返回自动生成的ID 前言:
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 字段名字段类型是否为字段默认值备注
IDPrimary Key nc_uid nchar(20) × 用户()
nvc_username nvarchar(50) × 用户名
nvc_password nvarchar(50) × 密码
2.存储过程如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[sp_users_add]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
drop procedure [sp_users_add]
CREATE PROCEDURE sp_users_Add
@nc_uid nchar(20) output, //ouput表示该参数是可以输入输出的 @nvc_username nvarchar(50),
@nvc_password nvarchar(50)
AS
set @nc_uid = replace(replace(replace(CONVERT(nchar(20), getdate(), 120 ),'-',''),' ',''),':','')+DATENAME(YEAR,GETDATE())+CAST(FLOOR(RAND()*10) AS varchar)+CAST(FLOOR(RAND()*10) AS varchar)
while exists(select * from users where [nc_uid]=@nc_uid)
begin
set @nc_uid = replace(replace(replace(CONVERT(nchar(20), getdate(), 120 ),'-',''),'
',''),':','')+CAST(FLOOR(RAND()*10) AS
varchar)+DATENAME(YEAR,GETDATE())+CAST(FLOOR(RAND()*10) AS varchar)
end
begin
INSERT INTO [users]([nc_uid],[nvc_username],[nvc_password])
VALUES(@nc_uid,@nvc_username,@nvc_password)
end
return 1
GO
二、后台
1.model类
using System;
namespace Model
{
///
/// shuju:实体类(属性说明自动提取数据库字段的描述信息)
///
[Serializable]
public partial class usersModel
{
public usersModel()
{ }
#region Model
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
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;
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
namespace DAL
{
///
/// 数据访问类:users
///
public partial class usersDAL
{
public usersDAL()
{}
///
执行存储过程 /// 新增一条记录
///
///
Model
///
id
public string AddByProcedure(usersModel model)
{
string uid = null;
IDataParameter[] parameters = {
new SqlParameter("@nc_uid", SqlDbType.NChar,20),
new SqlParameter("@nvc_username", SqlDbType.NVarChar,50),
new SqlParameter("@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;
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
using System.Data;
using System.Collections;
namespace DBUtility
{
///
/// 数据访问抽象基础类
///
public abstract class DbHelperSQL
{
//数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现.
public static string connectionString = PubConstant.ConnectionString;
public DbHelperSQL(){}
///
///执行存储过程,返回Output输出参数值
///
///
存储过程名
///
要返回值的参数名
///
存储过程参数
///
string
public static object RunProcedure(string storedProcName, string output, IDataParameter[]
paramenters)
{
using (SqlConnection connection = 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;
}
@Author Liuker liuzq1991@gmail.com C#运用存储过程新增一条记录并返回自动生成的ID
else
{
return obj;
}
}
}
///
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
///
///
数据库连接
///
存储过程名
///
存储过程参数
///
SqlCommand
private static SqlCommand BuildQueryCommand(SqlConnection connection, string
storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parameter 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;
}
}
}