在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例

  测试案例的业务是:我有两张表分别命名为A,B,当我在A表中插入一条数据时,这时我希望将插入的记录中的某些字段插入到B表中。很明显,很快我们会想到触发器,其实这个业务并不复杂,我们在一个触发器中就可以轻松实现,但是基于此篇博文的目的,我把向B表插入数据的功能放到了程序集里面,也就是我们的C#程序中。废话不多说,我们接下来就开始

1.建表,A,B。表结构如下(A,B表表结构一样,均是下面的Error表)

2.然后我们开始建程序集了,就是我们的动态库

 using Microsoft.SqlServer.Server;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Data;
using System.Threading; namespace TestProc
{
public class TestClass
{
[Microsoft.SqlServer.Server.SqlTrigger(Name = "ELMAH_Error_Trigger", Target = "ELMAH_Error", Event = "FOR INSERT ")]
public static void triggerInsert()
{
string id = "";
DateTime dt = DateTime.Now;
//获取插入A表的数据
using (SqlConnection cn = new SqlConnection())
{
cn.ConnectionString = "context connection=true";
cn.Open(); using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "select a.Name, a.Tctime from INSERTED a";
SqlDataReader dr = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
while (dr.Read())
{
id = dr[].ToString();
dt=Convert.ToDateTime(dr[]);
SqlContext.Pipe.Send(id+dt.ToShortDateString()+"\r\n");
}
}
} using (SqlConnection cn1 = new SqlConnection())
{
cn1.ConnectionString =@"server =192.168.0.102\DATAUM; database =HR;user id = sa ;password =123456";
cn1.Open();
using (SqlCommand cmd1 = cn1.CreateCommand())
{
cmd1.CommandText = "insert into Error Values(" + id + ",'" + dt + "')";
SqlContext.Pipe.Send(cmd1.CommandText + "\r\n");
cmd1.ExecuteNonQuery();
}
}
}
}
}

  3.在SQL Server中编辑和布暑程序集,下面我将通过代码的方式进行部署

把第2部中的代码编译成动态库,然后在sql server 中执行语句

create assembly TestProc from 'E:\Disco\TestProc\TestProc\bin\Debug\TestProc.dll' with permission_set = unsafe   --路径根据自己的情况而变动

   创建成功后我们就可以在左边找到我们所建的程序集

       4.接着我们来创建触发器对此程序集进行调用

CREATE TRIGGER A_insert
ON ELMAH_Error
AFTER INSERT
AS
EXTERNAL NAME TestProc.[TestProc.TestClass].triggerInsert
GO

   5.好了,以上步骤基本上配置完了,接下来我们进行测试,向A表中插入数据时看能不能向B表中也插入相应的数据

insert into A Values("test",'2015/10/21 15:30:45')

6.可能你执行上面的插入语句会报错,那是因为在程序集中我们插入的数据库是远程机,应该对其进行相应的设置,以下是配置步骤,注意(以下配置必须同时在两个机子上进行)

    a.在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator-->属性-->启动

    b.在CMD下运行"net start msdtc"开启服务后正常

c. 如果是win7,选择"管理工具下"的"组件服务",我的电脑->Distributed Transaction Coordinator->本地DTC,单击打开属性窗口,切换到"安全"选项卡,做如图配置

    保存后再执行测试就可以了。

好了,至此大功告成!

SQL触发器与CLR的使用的更多相关文章

  1. Sql Server 与CLR集成

    .NET编程和SQL Server ——Sql Server 与CLR集成   一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数等十分有限,经常需要外部 ...

  2. .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)

    原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...

  3. SQL触发器实例讲解

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...

  4. 在SQL中使用CLR提供基本函数对二进制数据进行解析与构造

      二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换. 现借助CLR提 ...

  5. SQL触发器实例

    SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...

  6. SQL触发器中的deleted表和inserted表

    SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...

  7. SQL 触发器(学生,课程表,选修表)

    SQL 触发器(学生,课程表,选修表) 触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行.可以这样形容:存储过程像一个遥控炸弹,我 ...

  8. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  9. PB+MS SQL+触发器必须指出

    PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...

随机推荐

  1. c#基础学习(0806)之抽象类实现多态

    首先,要判断是否使用抽象类,可以从下面两个方面进行判断: 1.是不是需要被实例化 2.父类中有没有默认的实现 如果不需要被实例化,父类中没有默认的实现,则用抽象类(否则用虚方法来实现) 下面举个简单的 ...

  2. C# 指针操作相关

    C# 指针操作相关 =========================================            // ** 取int 地址 以指针访问指向值 ** //         ...

  3. 使用ms owin 搭建oauth2 server

    http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server 有示例代码 关于token的 ...

  4. mysql sql语句大全(MySQL语句 整理一)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  5. 中国移动CMPP协议错误码

    中国移动CMPP协议错误码 状态码 说明                             出现次数高 DELIVRD 消息发送成功 用户成功接收到短信 REJECTD 消息因为某些原因被拒绝不 ...

  6. js this问题和es6箭头函数this问题

    JS中this的四种用法 1.在一般函数方法中使用 this 指代全局对象 function test(){ this.x = 1; alert(this.x); } test(); //1 2.作为 ...

  7. Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  8. mysqli 查询

    $mysqli = new mysqli('localhost', 'user', 'pwd', 'dbname'); $query = "select goods_id,goods_nam ...

  9. 记ASP.NET 使用 X509Certificate2 出现的一系列问题

    在做微信支付退款的时候,由于需要使用到p12证书,结果就遇到一系列的坑.这里做个记录方便以后查阅. 原先加载证书的代码: X509Certificate2 cert = new X509Certifi ...

  10. 最长斐波那契序列-LeetCode-873

    英文版A sequence X_1, X_2, ..., X_n is fibonacci-like if: - n >= 3- X_i + X_{i+1} = X_{i+2} for all ...