Asp.Net 储存过程表变量传递--(用临时表一次性插入所有数据)

5 篇文章 0 订阅
1 篇文章 1 订阅

前言:

在做的项目中,有一个要求就是需要用存储过程进行对数据进行一次性的插入操作。之前由于没接触过,也是弄的很头大。在网上看了还多资料,写的不详细,实用性不好,最后自己根据网上的总结出自己的一个大家都可以用的。

在正式开始之前先介绍下为啥用存储过程对数据进行操作。

①:效率高,只连接一次数据库,就可以完成所有的数据操作,不必进行循环一次次的连接数据库。

②:减少后代的代码量,直接调用存储过程就行。

在解释下一个名词:临时表

这个词我在做这功能之前我也没有用过。所谓临时表:它就是一个和我们数据库所建的表没有什么很大的区别。唯一的区别就是它是临时的,临时表存储在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();
                    
        }

执行效果:

结尾:

       分享:努力成功之后的喜悦,是你最好的兴奋剂!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值