前言:
在做的项目中,有一个要求就是需要用存储过程进行对数据进行一次性的插入操作。之前由于没接触过,也是弄的很头大。在网上看了还多资料,写的不详细,实用性不好,最后自己根据网上的总结出自己的一个大家都可以用的。
在正式开始之前先介绍下为啥用存储过程对数据进行操作。
①:效率高,只连接一次数据库,就可以完成所有的数据操作,不必进行循环一次次的连接数据库。
②:减少后代的代码量,直接调用存储过程就行。
在解释下一个名词:临时表
这个词我在做这功能之前我也没有用过。所谓临时表:它就是一个和我们数据库所建的表没有什么很大的区别。唯一的区别就是它是临时的,临时表存储在tempdb中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。
对于临时表有如下几个特点:
本地临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数据库连接上的独立性。
真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
临时表在Sql Server中的创建的两种方式:
--第一种
create type tbAddUser as table
(
uAccount char(8),
uPwd varchar(16),
uName nvarchar(8),
uAge int,
uAddress nvarchar(64),
uPhone char(11)
)
--第二种
create table #tbUser
(
uAccount char(8),
uPwd varchar(16),
uName nvarchar(8),
uAge int,
uAddress nvarchar(64),
uPhone char(11)
)
临时表在存储过程中的运用:
create proc proAddUserTest
@user as tbAddUser readonly--表变量,用于接受后台传递的表,传递给表变量(临时表)
AS
BEGIN
SET NOCOUNT ON;
insert into tbUserInfo select * from @user--将临时表中的数据插入到我们实际操作的表中
END
select * from tbUserInfo
VS里调用存储过程(传递表中数据)
public DataTable GetTable()
{
//定义表结构要和数据库中表中的字段一致
DataTable table = new DataTable();
table.Columns.Add("userAccount", typeof(string));
table.Columns.Add("userPwd", typeof(string));
table.Columns.Add("userName", typeof(string));
table.Columns.Add("userAge", typeof(int));
table.Columns.Add("userAddress", typeof(string));
table.Columns.Add("userPhone", typeof(string));
//给各个列添加对应的表数据--一定要这样添加,其他的可能报错,原因我也不知道,哈哈
table.Rows.Add("45678912", "000000", "罗三炮", 21,"商丘","14725836912");
return table;
}
public void Add(DataSet userData)
{
DataTable dtUser = GetTable();
//连接数据库。我用的是EF,大家如果用的是其他的,直接把连接数据库的con替换掉我的 就行
SqlConnection conn = (SqlConnection)db.Database.Connection;
conn.Open();
SqlCommand sqlcmd = conn.CreateCommand();
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.CommandText = "proAddUserTest";//存储过程名
//@user存储过程里的表变量,dtUser需要传递的表
SqlParameter param = sqlcmd.Parameters.AddWithValue("@user", dtUser);
SqlDataReader sdr = sqlcmd.ExecuteReader();
conn.Close();
}
执行效果:
结尾:
分享:努力成功之后的喜悦,是你最好的兴奋剂!