CLR集成中配置文件的使用


之前提到了利用SQL Server的新特性CLR集成创建了一个存储过程,由于我这里的存储过程需要访问网络资源,一般的程序,对于这些服务器端的IP地址都是写入配置文件,那么对于CLR集成来说,它也是可以使用配置文件的。下面链接是我在StackOverFlow上面询问如何使用配置文件的链接,问题下面的回答完美解决了这个问题,点击这里,当然你也可以直接点击查看这篇文章

这里的配置文件比较特殊,不像是普通应用程序的APP.config,而是有一定的规则。首先,由于我们的C#程序代码是运行在SQL Server中的(CLR集成的方式),依赖于数据库进程,那么配置文件肯定也就是跟数据库进程有关系了,这里可以通过查看数据库的安装目录来找到数据库可执行程序的目录,也可以直接执行下面这段SQL脚本:

declare @SQLRoot varchar(1024)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SQLRoot OUTPUT
select @SQLRoot

进入\Binn这个目录,就会看见一个可执行程序sqlservr.exe,那么相应的,配置文件的名字也必须是sqlservr.exe.config,没有这个文件请自行创建,里面的内容可以和之前普通应用程序的配置文件相同,下面是我的配置文件的内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="connection" connectionString="127.0.0.1"/>
  </connectionStrings>
</configuration>

我这里比较简单,就配置了一个IP地址。在完成配置文件之后,程序代码里就能和平常使用配置文件一样获取配置值了,这里需要注意的是,配置文件的名字一定不能更改。要是还想获取更细节的东西可以去看上面给出的那篇文章。

下面说一点这个昨天遇到的一个问题,在CLR集成里面,代码中完成了一个获取CDC表数据,并且连接TCP Server程序,将CDC表数据发送给TCP Server的功能,刚开始是获取一个值,就向服务端进行发送,由于表中数据量很大,所以发送数据这个过程非常的耗时,每次都对socket进行写入操作。后来是使用MemoryStream这个类,将所有从表中读取的数据,全都先放到这个内存流里面,之后将这个流里面的数据一次性发送到服务端,这样大大减少了发送时间。

以上所写还未进行实际线上验证,特别是在存储过程里面获取CDC表数据并通过TCP发送到服务端,之后几天会根据这个思路完成一个比较完整的更新模块。

补充:总共两种方式获取数据,一种就是上面提到的,直接在存储过程里把表数据全部发送出来,另一种就是,存储过程对这些表做轮询,当发现有表数据更新时通知服务端,服务端主动获取更新数据,当然了,这个通知也还是通过存储过程发送出来的(与服务端TCP连接)。


非专业娱乐型程序员。
Published under (CC) BY-NC-SA in categories 技术  tagged with C#  SQL Server