SQLSERVER环境下调用包含webservice引用的.net类库
2014-05-07 10:06
239 查看
最近做到一个项目,涉及到系统的集成。对于SSO单点登陆已经解决,但紧接着一个难点便是两个系统中基础数据的同步。项目情况大致如下:
系统AB都是采用SQLSERVER 2005 数据库的B/S系统。系统A的数据库中数据未加密,系统B的数据库中数据为加密数据,且因商业合同关系,不能对B数据库进行任何直接操作。系统B提供有相应的webservice,可以用来同步基础数据。
为了解决这个问题,初步想法是将自动同步交给数据库来完成,小批量的数据修改、添加使用触发器,大量的修改、添加使用中间表和作业调度。
但这样做的难点就是如果调用webservice。在网上粗略浏览了一下资料,基本上是SQLSERVER调用类库的思路,这个和我之前做的一个数据加密项目类似,唯一不同的是以前的类库中没有webservice。
既然思路是对的,那么就开始动手。
1、先是利用VS2005创建了一个类库解决方案
2、引用要用到的webservice
3、在类文件中建立UserSynchronization和DepSynchronization类,分别用于同步用户和部门机构。
为了方便数据库调用,两个类的方法均为static,且每个类只提供一个主调用方法。以DepSynchronization类为例,供数据库调用的方法如下:
4、编译类库,在release下,生成了四个文件,其中有两个是DLL文件。
5、数据库中注册类,并映射调用函数。
在映射函数时出了一个问题,起初我将数据库函数的参数类型设为了varchar,引发了SQL-CLR类型不匹配,原来在C#中的string类型映射过来应该是nvarchar。另外提一下,bool映射到SQLSERVER2005应该是bit。
6、测试:
select dbo.SeeyonOperateDepart('Creater','service-admin','19840511suzhou','TEST2014','测试部门');
系统报错:
搜索相关资料后发现,编译时生成的另一个DLL文件,***.XmlSerializers.dll,是用来序列化和反序列化webservice引用的,必须注册到SQLSERVER。在可编程性-程序集中右键-新建程序集,将这个类注册。
7、再次测试OK
系统AB都是采用SQLSERVER 2005 数据库的B/S系统。系统A的数据库中数据未加密,系统B的数据库中数据为加密数据,且因商业合同关系,不能对B数据库进行任何直接操作。系统B提供有相应的webservice,可以用来同步基础数据。
为了解决这个问题,初步想法是将自动同步交给数据库来完成,小批量的数据修改、添加使用触发器,大量的修改、添加使用中间表和作业调度。
但这样做的难点就是如果调用webservice。在网上粗略浏览了一下资料,基本上是SQLSERVER调用类库的思路,这个和我之前做的一个数据加密项目类似,唯一不同的是以前的类库中没有webservice。
既然思路是对的,那么就开始动手。
1、先是利用VS2005创建了一个类库解决方案
2、引用要用到的webservice
3、在类文件中建立UserSynchronization和DepSynchronization类,分别用于同步用户和部门机构。
为了方便数据库调用,两个类的方法均为static,且每个类只提供一个主调用方法。以DepSynchronization类为例,供数据库调用的方法如下:
public static string OperateDepart(string OperateKind, string user, string pwd, string code, string depName,string schoolName) { switch (OperateKind) { case "UpdateByCode": return UpdateByCode(user,pwd,code,depName); break; case "DeleteByCode": return DeleteByCode(user, pwd, code); break; case "Creater": return Creater(user, pwd, code, depName, schoolName); break; case "Start": return EnableByCode(user, pwd, code, true); break; case "End": return EnableByCode(user, pwd, code, false); break; } return "Wrong"; }
4、编译类库,在release下,生成了四个文件,其中有两个是DLL文件。
5、数据库中注册类,并映射调用函数。
CREATE ASSEMBLY [SeeyonAppCustomBySZ] FROM 'C:\DllForSqlServer\AppCustomBySZ\AppCustomBySZ.dll' WITH PERMISSION_SET = UNSAFE -- CREATE FUNCTION [dbo].[SeeyonOperateDepart] (@OperateKind nvarchar(30), @user nvarchar(30), @pwd nvarchar(50), @code nvarchar(50), @depName nvarchar(500), @schoolName nvarchar(50)) RETURNS nvarchar(1000) WITH EXECUTE AS CALLER AS EXTERNAL NAME [AppCustomBySZ].[AppCustomBySZ.DepSynchronization].[OperateDepart]
在映射函数时出了一个问题,起初我将数据库函数的参数类型设为了varchar,引发了SQL-CLR类型不匹配,原来在C#中的string类型映射过来应该是nvarchar。另外提一下,bool映射到SQLSERVER2005应该是bit。
6、测试:
select dbo.SeeyonOperateDepart('Creater','service-admin','19840511suzhou','TEST2014','测试部门');
系统报错:
Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information.
搜索相关资料后发现,编译时生成的另一个DLL文件,***.XmlSerializers.dll,是用来序列化和反序列化webservice引用的,必须注册到SQLSERVER。在可编程性-程序集中右键-新建程序集,将这个类注册。
7、再次测试OK
相关文章推荐
- 关于在java环境下调用 .net的 webservice无法获取参数的问题
- JAVA调用.NET WebService终极方案(包含对SoapHeader的处理)
- .net环境 应用SOAP客户端引用webservice的例子
- 20101109 学习记录: C#.net访问web URL并处理返回值 && 不加web引用调用webservice
- php实现通过soap调用.Net的WebService asmx文件
- 【.Net码农】异步调用WebService访问数据小结
- Shell脚本中调用、引用、包含另外一个脚本文件的两种方法
- 用JAVA调用.net的webservice实例
- axis2 调用.net基于https的WebService接口
- 解决java用axis调用.NET写的webService中遇到的各种Exception
- [转]动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
- JS使用AJAX调用.net WebService
- .Net 中webService发布与调用
- 当我们修改了自己电脑上的IP地址时,我们在项目中调用的自己本地的webservice时,我们如何修改,才能让项目中引用的webservice不受影响呢?
- 解决.NET 项目引用类库出现黄色警告
- 在asp.net2.0环境中用Ajax调用WebService方法
- 用Delphi7 调用.NET 2.0的WebService 所要注意的问题
- .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox
- 【.NET调用Python脚本】C#调用python requests类库报错 'module' object has no attribute '_getframe' - IronPython 2.7
- C# 不加web引用,动态调用webservice