发布网友 发布时间:2022-04-26 00:34
共8个回答
懂视网 时间:2022-04-08 06:00
但是不仅如此,如果客户提供给你的excel本身存在着重复数据,或是excel中的某些数据已经在数据库存在,那这时,在向数据库插入数据前你还得判重,如果不存在才进行导入
通常,我们第一步就会通过上传的方式把excel中的数据读到内存,然后通过循环的方式得出一条一条数据,接着对于每条数据用关键字段去往数据库中进行一次查重,若存在则不做事情,若
不存在则向数据库中插入一条数据。这样一来,我们每一条数据都会与数据库打两次交道,众所周知,每连接一次数据库那是需要时间的,次数一多相当影响性能。若是成千上万条数据的话,可
想而知,这个导入过程会有多慢,尤其是Web应用程序,很有可能在我的请求还没执行完,突然程序就被终止了。
当然,还有个办法,就是拼SQL,每循环一条数据,首先判断,若不重复,我写一条SQL语句保存在某个变量中,直到循环到最后一条,可能会拼出多条Insert语句,最后送到数据库一次执
行,但是大家有没有想过,一旦数据量过大,几万,或几十万条数据拼成的字符串可想而知会有多长,送到数据库就会有被截断的可能。更何况还是逃离不了每次都要查询重复的惨况。
一般来说,SQL语句离数据库端越近,执行效率越高,有没有可能,我把所要插入的数据集合一次性送给数据库,让判断重复,插入,返回重复数据的工作统统由数据库来执行呢?这样我只
要与数据库打一次交道,等待数据库给我结果就行。那么接下来就是我要讲到的利用表值参数来完成这一功能。
由于为了讲述,例子中的表都比较简单
1.首先我们来创建一张表(建库的过程在这里我就不说明了,为了大家看得清晰,尽量去除了无关的脚本行)
1 CREATE TABLE [dbo].[BulkTestTable]( 2 [Id] [int] NOT NULL, 3 [UserName] [nvarchar](32) NULL, 4 [Pwd] [varchar](16) NULL, 5 PRIMARY KEY CLUSTERED 6 ( 7 [Id] ASC 8 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 9 ) ON [PRIMARY] 10 11 GO
2.创建表值类型
1 USE [BulkTestDB] 2 GO 3 4 /****** Object: UserDefinedTableType [dbo].[BulkTestTableType] Script Date: 07/08/2015 16:04:38 ******/ 5 CREATE TYPE [dbo].[BulkTestTableType] AS TABLE( 6 [Id] [int] NULL, 7 [UserName] [nvarchar](32) NULL, 8 [Pwd] [varchar](16) NULL 9 ) 10 GO
3.写批量插入的存储过程
1 CREATE procedure [dbo].[usp_BulkTestTable_Import]
2 (@paratable as BulkTestTableType readonly) --此处的BulkTestTableType就是上面所定义的表类型,实际不用对它进行操作,只需要在程序中传入一个表给它,然后从它里面进行读取
3 AS
4 Insert INTO dbo.BulkTestTable(Id,UserName,Pwd)
5 select * from @paratable A
6 WHERE Not EXISTS(select B.Id from BulkTestTable B WHERE B.Id=A.Id)
7 SELECT * from @paratable A WHERE EXISTS (select B.Id from BulkTestTable B WHERE B.Id=A.Id) --查询出重复的记录
8 GO
在这里,我的Id不是自动增长的,仅仅是主键而已,所以这里通过Id来判断记录是否唯一或重复
接下来在C#代码里面写一个导入方法,调用这个存储过程。
这里的参数dt就是我们导入excel时生成的DataTable,这个DataTable的表结构也就是列要与我们定义的表值“BulkTestTableType”结构相同,返回值就是我们所要的重复记录
1 public static DataSet BatchInsert(DataTable dt) 2 { 3 SqlParameter parameter = new SqlParameter("@paratable",dt); 4 parameter.SqlDbType = SqlDbType.Structured; 5 parameter.TypeName = "BulkTestTableType"; //这里的类型名称应与我们定义的表值名称相同
6 SqlParameter[] sqlParameters = new SqlParameter[] { parameter };
7return SqlHelper.RunProcedure(CommandType.StoredProcedure, "usp_BulkTestTable_Import", sqlParameters);
8 }
热心网友 时间:2022-04-08 03:08
1、意思是:
是条件运算符,条件运算符是C语言中唯一的三目运算符,就是说他有三个运算对象。
2、条件运算符的形式是“?:”由他构成的表达式称为条件表达式。
形式为:表达式1?表达式2:表达式3
扩展资料:
一、表达式为:表达式1?表达式2:表达式3
先求解表达式1,若其值为真(非0)则将表达式2的值作为整个表达式的取值,否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。
例如:
1、max=(a>b)?a:b
就是将a和b二者中较大的一个赋给max。
2、min=(a<b)?a:b
就是将a和b二者中较小的一个赋给min。
3、优先级
条件运算符优先级高于赋值、逗号运算符,低于其他运算符
例如:
⑴
m<n
?
x
:
a+3
等价于:(m<n)
?(x)
:(a+3)
⑵
a++>=10
&&
b-->20
?
a
:
b
等价于:(a++>=10
&&
b-->20)
?
a
:
b
⑶
x=3+a>5
?
100
:
200
等价于:x=
((
3+a>5
)
?
100
:
200
)
参考资料:百度百科-条件运算符
热心网友 时间:2022-04-08 04:26
是条件运算符。条件运算符是C语言中唯一的三目运算符,就是说他有三个运算对象。条件运算符的形式是“?:”由他构成的表达式称为条件表达式。形式为:
表达式1?表达式2:表达式3
运算功能是。先计算表达式1的值,若值为非0,则计算表达式2的值,并将表达式2的值作为整个条件表达式的结果;若表达式1的值为0,则计算表达式3的值,并将表达式3的值作为整个条件表达式的结果。
比如有以下条件表达式
(a>b)?a+b:a-b
a=8
b=4时,计算a+b=12
,所以表达式结果为12
a=4
b=8时,计算a-b=-4,所以表达式结果为-4
热心网友 时间:2022-04-08 06:01
~是位运算符,在二进制中是按位取反的意思,也就是0变成1,1变成0.
例如:
二进制数:a
=
1010
1111
那么,
~a
=
0101
0000
所以:
b
=
~a
就表示:0101
0000
了。
热心网友 时间:2022-04-08 07:52
判断的语句
条件运算符
?前是判断。
是的话选引号前面的,
不是选引号后面的
额。。楼主是原题吗。好像没有这么直接用的
翻译过来的话是
【是x吗
】?
【是(用a进行程序)】:【否(换成b进行程序)】
热心网友 时间:2022-04-08 10:00
这个是C语言的一个三目运算符
?:
意思是先判断?前面的表达式的逻辑值是否为真,如果为真,则取冒号前面的表达式的值为整个表达式的值,如果为假,则取冒号后面的表达式的值为整个表达式的值。
热心网友 时间:2022-04-08 12:25
这个运算符很常用。很有名的。基本上所有语言都支持这个叫做
三目运算符
条件
?
结果1
:
结果2
如果条件为真
显示结果1
如果条件为假
显示结果2
例:
2<3
?
aa
:
bb
结果是
aa
因为
2<3是正确的
热心网友 时间:2022-04-08 15:06
?:
是c语言中唯一的三元操作符,用法如下:
d
=
a?b:c;
意思就是a成立吗?如果a成立,d的值为b,否则d的值为c。