今天在做一个非常奇葩的东西。中间有个过程要在SQL触发器里面调用webservice接口。呵呵~

ALTER TRIGGER tgr_UpdateMemcached
ON dbo.[User]
AFTER UPDATE AS
--获得更新前的数据
--SELECT * FROM Deleted AS OldData --获得更新后的数据
--SELECT * FROM Inserted AS NewData --调用webService----------------
declare @ServiceUrl as nvarchar(1000)
DECLARE @UrlAddress nvarchar(500) --WebService地址:以http开头,结尾带斜杠。比如'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/'
set @UrlAddress = 'http://localhost/webService_UpdateCache/WebService1.asmx' DECLARE @FunName nvarchar(50)--WebService中调用的方法名:比如'getMobileCodeInfo'
SET @FunName = 'UpdateCache' --以下參数相应WebService中4个參数的[參数名]
declare @UserCode nvarchar(36),@UserName nvarchar(36),@UserAge nvarchar(36)
SET @UserCode='UserCode'
SET @UserName='UserName'
SET @UserAge='UserAge' --拼接參数名称
DECLARE @UserCode_Value nvarchar(50)='0000',@UserName_Value nvarchar(50)='0000',@UserAge_Value nvarchar(50)='0000' SELECT * FROM Inserted SELECT @UserCode_Value=LTrim(RTrim(UserCode)),@UserName_Value=LTrim(RTrim(UserName)),@UserAge_Value=LTrim(RTrim(UserAge)) FROM Inserted ;--从inserted表给參数赋值 --拼接地址
SET @ServiceUrl = @UrlAddress +'/'+ @FunName + '?' + @UserCode + '=' + [dbo].[UrlEncode](@UserCode_Value) +'&' + @UserName + '=' +[dbo].[UrlEncode](@UserName_Value) +'&' + @UserAge + '=' + [dbo].[UrlEncode](@UserAge_Value)
--SET @ServiceUrl = @UrlAddress +'/'+ @FunName + '?' + @UserCode + '=' + @UserCode_Value +'&' + @UserName + '=' +@UserName_Value +'&' + @UserAge + '=' + @UserAge_Value --SELECT @ServiceUrl --查看拼接地址,调试时打开 --訪问地址获取结果
Declare @Object as Int
Declare @ResponseText as nvarchar(4000) EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; --创建OLE组件对象
Exec sp_OAMethod @Object, 'open', NULL, 'post',@ServiceUrl,'false' --打开链接,注意是get还是post
EXEC sys.sp_OAMethod @object,'setRequestHeader',NULL,'Content-Type','application/x-www-form-urlencoded;charset=UTF-8'
Exec sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT --输出參数
Select @ResponseText --输出结果
Exec sp_OADestroy @Object
GO

为了使SQL能够想代码里面对參数进行编码和解码,还须要增加以下自己定义函数:

USE [TestMemcached]
GO
/****** Object: UserDefinedFunction [dbo].[UrlEncode] Script Date: 2015/7/6 21:36:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO ALTER FUNCTION [dbo].[UrlEncode] ( @Param NVARCHAR(2000) ) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @HexStr VARCHAR(MAX) --Use system function to convert input string to hex string SET @HexStr = master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(MAX), @Param)) --Remove the starting '0x' SET @HexStr = RIGHT(@HexStr, LEN(@HexStr)-2) --Declare required variables DECLARE @I INT, @Len INT DECLARE @Output VARCHAR(MAX), @S CHAR(4), @C CHAR(1) DECLARE @LoByte TINYINT, @HiByte TINYINT --Get length SET @Len=LEN(@HexStr)/4 --Start with first character SET @I=0 --Prepare the output string SET @Output='' WHILE @I<@Len BEGIN SET @S=SUBSTRING(@HexStr, @I*4 + 1, 4) IF RIGHT(@S, 2)='00' BEGIN --Try to convert 2 hex digits to char SET @LoByte = ASCII(SUBSTRING(@S, 2, 1)) - 48 IF @LoByte>10 SET @LoByte = @LoByte - 39 --0x61'a'-> 10 SET @HiByte = ASCII(SUBSTRING(@S, 1, 1)) - 48 IF @HiByte>10 SET @HiByte = @HiByte - 39 SET @C=CHAR(@LoByte + @HiByte * 16) --If it's a reserved character, don't encode IF @C LIKE '[A-Za-z0-9()''*-._! ]' SET @Output = @Output + @C ELSE SET @Output = @Output + '%' + LEFT(@S, 2) END ELSE SET @Output = @Output + '%u' + RIGHT(@S, 2) + LEFT(@S, 2) --Move to next hex SET @I = @I + 1 END RETURN @Output END

同一时候要注意webservice里面的方法哟:

 [WebMethod]
public bool UpdateCache(string UserCode, string UserName, string UserAge)
{
// HttpContext.Current.Response.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
//string action = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString["UserName"]);
// string a = HttpContext.Current.Request.QueryString["UserName"]; UserCode = HttpUtility.UrlDecode(UserCode);
UserName = HttpUtility.UrlDecode(UserName);
UserAge = HttpUtility.UrlDecode(UserAge);
return MemCache.GetInstance().Replace<ClassLib.User>(UserCode, new ClassLib.User() { UserCode = UserCode, UserName = UserName, UserAge = UserAge }); }

SQL调用WebService接口的更多相关文章

  1. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  2. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

  3. 使用soapui调用webservice接口

    soapui是专门模拟调用webservice接口的工具,下面介绍下怎么使用: 1.下载soapui并安装: 2.以免费天气获取接口为例:http://www.webservicex.net/glob ...

  4. 使用JS调用WebService接口

    <script> $(document).ready(function () { var username = "admin"; var password = &quo ...

  5. java 调用webservice接口wsdl,推荐使用wsdl2java,放弃wsimport

    网上说wsimport是jdk1.6后自带的客户端生成调用webservice接口的工具,其实我挺喜欢原生的东西,毕竟自家的东西用着应该最顺手啊,但往往让人惊艳的是那些集成工具. 本机jdk1.8.1 ...

  6. js调用Webservice接口案例

    第一步:新建Webservice接口 主文件方法 using System;using System.Collections.Generic;using System.Web;using System ...

  7. 动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  8. ThinkPHP使用soapclient调用webservice接口

    1,开启 php.ini 这2个服务 12 extension=php_openssl.dllextension=php_soap.dll 以公共天气预报webservice为例,采用thinkPHP ...

  9. 调用webservice接口,报错:(十六进制值0x01)是无效的字符

    #事故现场 调用webservice接口,报错:(十六进制值0x01)是无效的字符. 如图: 意思是webservice返回的信息中包含无效的字符,无法解析成xml: #分析 使用postman向we ...

随机推荐

  1. bzoj 3676 后缀自动机+马拉车+树上倍增

    思路:用马拉车把一个串中的回文串个数降到O(n)级别,然后每个串在后缀自动机上倍增找个数. #include<bits/stdc++.h> #define LL long long #de ...

  2. Django实战(5):引入bootstrap,设置静态资源

    之前生成了Product类的scaffold,但是如同rails的开发者David所讲的那样,scaffold几乎没什么用.所以按照<Agile Web Development with Rai ...

  3. Ionic实战七:Ionic 音乐以及社交页面

    Ionic 音乐以及社交页面,可以用于二次开发,也可以用于社交或者音乐app页面模板,但是不足的是图片没法预览.      

  4. shell 转码BIG5 UTF8

    BIG-5 轉 UTF-8 若要將一個文字檔從 BIG-5 編碼轉換為 UTF-8 編碼,可以執行: iconv -f BIG-5 -t UTF-8 big5.txt > utf8.txt 其中 ...

  5. 【CF540D】 D. Bad Luck Island (概率DP)

    D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. CodeForces1082G Petya and Graph 最小割

    网络流裸题 \(s\)向点连边\((s, i, a[i])\) 给每个边建一个点 边\((u, v, w)\)抽象成\((u, E, inf)\)和\((v, E, inf)\)以及边\((E, t, ...

  7. BZOJ 2653: middle 主席树 二分

    https://www.lydsy.com/JudgeOnline/problem.php?id=2653 因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和 ...

  8. sgu 194 上下界网络流可行流判定+输出可行流

    #include <cstdio> #include <cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define oo 0x ...

  9. 【转 记录】python中的encode以及decode

    字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...

  10. LR监控linux系统资源

    一.检查系统是否安装rpc服务 使用LR监控Linux,首先查看系统是否开启了rpc服务,其次查看Linux系统守护进程rpc.restat是否启动,该进程是必须的.可以通过命令rpcinfo -p来 ...