必须掌握的专业知识

1.触发器

2.sqlbulkcopy

我的主要用途

开发设计数据库同歩的专用工具,必须大批数据插进和数据升级。

方法

应用SqlBulkCopy类对数据开展数据大批量拷贝,将必须同歩数据的表新创建一个构造同样的临时表。随后在临时表撰写触发器用以对升级数据的表开展数据插进和升级;

触发器关键点

1.触发器(trigger)是一种独特的存储过程,如果你对一个表开展Insert、Delete或Update时开展触发;

2.触发器触发时全自动在系统软件建立inserted和deleted表,触发器实行进行后全自动删掉:

  inserted储放,增加和升级的数据;

  deleted表储放删掉和升级前的数据;

3.AFTER和INSTEAD OF是二种触发器:

  AFTER是在进行实行Insert、Delete或Update才开展触发;INSTEAD OF 触发器的姿势要早于表的管束解决;

  触发器內容参照   http://www.cnblogs.com/selene/p/4493311.html

SqlBulkCopy类

实例编码

 1 /// <summary>
 2 /// SqlBulkCopy
 3 /// </summary>
 4 /// <param name="connectionString">总体目标联接标识符</param>
 5 /// <param name="TableName">总体目标表</param>
 6 /// <param name="dt">数据源</param>
 7 private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
 8 {
 9     using (SqlConnection conn = new SqlConnection(connectionString))
10     {
11         using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.FireTriggers))
12         {
13             try
14             {
15                 sqlbulkcopy.DestinationTableName = TableName;
16                 for (int i = 0; i < dt.Columns.Count; i  )
17                 {
18                     sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
19                 }
20                 sqlbulkcopy.WriteToServer(dt);
21             }
22             catch (System.Exception ex)
23             {
24                 throw ex;
25             }
26         }
27     }
28 }

           MSDN详细介绍     

尤其表明的是 

  SqlBulkCopyOptions 特性设定为FireTriggers,是来激话相匹配表触发器的;

案例

新创建三张表,构造比较简单;

SELECT  Table_1.id ,
        Table_1.name
FROM    dbo.Table_1;

SELECT  Table_2.id ,
        Table_2.name
FROM    dbo.Table_2;

SELECT  Table_3.id ,
        Table_3.name
FROM    dbo.Table_3;

创建表

CREATE TABLE [dbo].[Table_1]
    (
      [id] [NCHAR](10) NULL ,
      [name] [NCHAR](10) NULL
    )
ON  [PRIMARY];

当向 Table_3 插进数据时,

分辨数据在 Table_1 是不是存有同样 id 假如存有,升级 name 字段名;假如不会有增加数据到 Table_1。

表 Table_2 关键用以检测触发器内的句子;

Table_3 的触发器

CREATE TRIGGER [dbo].[tri_Insert]  ON [dbo].[Table_3]
INSTEAD OF INSERT 
AS
--存有升级
UPDATE dbo.Table_1 SET id = INSERTED.id,name = INSERTED.NAME
FROM Table_1  JOIN inserted  ON Table_1.id = INSERTED.id

--不会有增加
INSERT dbo.Table_1
        ( id, name )
SELECT 
    INSERTED.id,INSERTED.name
    FROM INSERTED
    LEFT OUTER  JOIN Table_1  ON INSERTED.id = Table_1.id
WHERE Table_1.ID IS NULL 

这一触发器完成了当向 Table_3 表插进数据时分辨 Table_1 是不是存有这条数据,存有则升级,不会有则增加的目地; 

针对增加升级这两根句子,能够在Table_2 开展检测为什么那样写,基本原理比较简单;

 

FQA

SqlBulkCopy批量插入的DataTable规定:

  插进的DataTable务必与总体目标表结构同样,我的做法是先 SELECT * FROM  TableName WHERE 1=2  获得的表构造;

SqlBulkCopy主键是不是自动升级,同样主键是不是升级:

  我历经检测,主键标志列在Insert中置空后全自动自增,同样主键也不会积极升级,只是增加;

  另外当增加遇到标志管束时,插进同样标志的时候会回到出现异常;立即赋同样ID值也会新标志同样没法升级;

AFTER和INSTEAD OF二种触发器的不一样

  在向触发器批量更新数据时,INSTEAD OF是将数据立即交到触发器实行(姿势要早于表的管束解决??),触发器句子要是没有对表增加的句子则不容易增加数据;(??了解是不是有误差??)

  而AFTER是对表实际操作进行后才实行触发器;

  大批量插入升级实际操作应用 INSTEAD OF 的目地是那样就无需清临时表实际操作了。