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

  1. ALTER TRIGGER tgr_UpdateMemcached
  2. ON dbo.[User]
  3. AFTER UPDATE
  4.  
  5. AS
  6. --获得更新前的数据
  7. --SELECT * FROM Deleted AS OldData
  8.  
  9. --获得更新后的数据
  10. --SELECT * FROM Inserted AS NewData
  11.  
  12. --调用webService----------------
  13. declare @ServiceUrl as nvarchar(1000)
  14. DECLARE @UrlAddress nvarchar(500)
  15.  
  16. --WebService地址:以http开头,结尾带斜杠。比如'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/'
  17. set @UrlAddress = 'http://localhost/webService_UpdateCache/WebService1.asmx'
  18.  
  19. DECLARE @FunName nvarchar(50)--WebService中调用的方法名:比如'getMobileCodeInfo'
  20. SET @FunName = 'UpdateCache'
  21.  
  22. --以下參数相应WebService4个參数的[參数名]
  23. declare @UserCode nvarchar(36),@UserName nvarchar(36),@UserAge nvarchar(36)
  24. SET @UserCode='UserCode'
  25. SET @UserName='UserName'
  26. SET @UserAge='UserAge'
  27.  
  28. --拼接參数名称
  29. DECLARE @UserCode_Value nvarchar(50)='0000',@UserName_Value nvarchar(50)='0000',@UserAge_Value nvarchar(50)='0000'
  30.  
  31. SELECT * FROM Inserted
  32.  
  33. SELECT @UserCode_Value=LTrim(RTrim(UserCode)),@UserName_Value=LTrim(RTrim(UserName)),@UserAge_Value=LTrim(RTrim(UserAge)) FROM Inserted ;--从inserted表给參数赋值
  34.  
  35. --拼接地址
  36. SET @ServiceUrl = @UrlAddress +'/'+ @FunName + '?' + @UserCode + '=' + [dbo].[UrlEncode](@UserCode_Value) +'&' + @UserName + '=' +[dbo].[UrlEncode](@UserName_Value) +'&' + @UserAge + '=' + [dbo].[UrlEncode](@UserAge_Value)
  37. --SET @ServiceUrl = @UrlAddress +'/'+ @FunName + '?' + @UserCode + '=' + @UserCode_Value +'&' + @UserName + '=' +@UserName_Value +'&' + @UserAge + '=' + @UserAge_Value
  38.  
  39. --SELECT @ServiceUrl --查看拼接地址,调试时打开
  40.  
  41. --訪问地址获取结果
  42. Declare @Object as Int
  43. Declare @ResponseText as nvarchar(4000)
  44.  
  45. EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; --创建OLE组件对象
  46. Exec sp_OAMethod @Object, 'open', NULL, 'post',@ServiceUrl,'false' --打开链接,注意是get还是post
  47. EXEC sys.sp_OAMethod @object,'setRequestHeader',NULL,'Content-Type','application/x-www-form-urlencoded;charset=UTF-8'
  48. Exec sp_OAMethod @Object, 'send'
  49. EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT --输出參数
  50. Select @ResponseText --输出结果
  51. Exec sp_OADestroy @Object
  52. GO

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

  1. USE [TestMemcached]
  2. GO
  3. /****** Object: UserDefinedFunction [dbo].[UrlEncode] Script Date: 2015/7/6 21:36:27 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8.  
  9. ALTER FUNCTION [dbo].[UrlEncode]
  10.  
  11. (
  12.  
  13. @Param NVARCHAR(2000)
  14.  
  15. )
  16.  
  17. RETURNS VARCHAR(MAX)
  18.  
  19. AS
  20.  
  21. BEGIN
  22.  
  23. DECLARE @HexStr VARCHAR(MAX)
  24.  
  25. --Use system function to convert input string to hex string
  26.  
  27. SET @HexStr = master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(MAX), @Param))
  28.  
  29. --Remove the starting '0x'
  30.  
  31. SET @HexStr = RIGHT(@HexStr, LEN(@HexStr)-2)
  32.  
  33. --Declare required variables
  34.  
  35. DECLARE @I INT, @Len INT
  36.  
  37. DECLARE @Output VARCHAR(MAX), @S CHAR(4), @C CHAR(1)
  38.  
  39. DECLARE @LoByte TINYINT, @HiByte TINYINT
  40.  
  41. --Get length
  42.  
  43. SET @Len=LEN(@HexStr)/4
  44.  
  45. --Start with first character
  46.  
  47. SET @I=0
  48.  
  49. --Prepare the output string
  50.  
  51. SET @Output=''
  52.  
  53. WHILE @I<@Len
  54.  
  55. BEGIN
  56.  
  57. SET @S=SUBSTRING(@HexStr, @I*4 + 1, 4)
  58.  
  59. IF RIGHT(@S, 2)='00'
  60.  
  61. BEGIN
  62.  
  63. --Try to convert 2 hex digits to char
  64.  
  65. SET @LoByte = ASCII(SUBSTRING(@S, 2, 1)) - 48
  66.  
  67. IF @LoByte>10 SET @LoByte = @LoByte - 39 --0x61'a'-> 10
  68.  
  69. SET @HiByte = ASCII(SUBSTRING(@S, 1, 1)) - 48
  70.  
  71. IF @HiByte>10 SET @HiByte = @HiByte - 39
  72.  
  73. SET @C=CHAR(@LoByte + @HiByte * 16)
  74.  
  75. --If it's a reserved character, don't encode
  76.  
  77. IF @C LIKE '[A-Za-z0-9()''*-._! ]'
  78.  
  79. SET @Output = @Output + @C
  80.  
  81. ELSE
  82.  
  83. SET @Output = @Output + '%' + LEFT(@S, 2)
  84.  
  85. END
  86.  
  87. ELSE
  88.  
  89. SET @Output = @Output + '%u' + RIGHT(@S, 2) + LEFT(@S, 2)
  90.  
  91. --Move to next hex
  92.  
  93. SET @I = @I + 1
  94.  
  95. END
  96.  
  97. RETURN @Output
  98.  
  99. END

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

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

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. mysql 新增时,唯一索引冲突时更新

    INSERT INTO table_name(f1 ,f2 ,f3) VALUES(? ,?) on duplicate key update f2 = ? ,f3 = ?

  2. Django实战(3):Django也可以有scaffold

    rails有一个无用的”神奇“功能,叫做scaffold.能够在model基础上,自动生成CRUD的界面. 说它无用,是因为rails的开发者David说,scaffold”不是应用程序开发的目的.它 ...

  3. jenkins发邮件问题

    1.发送邮件不成功 Sending e-mails to: *******@**.cn    Finished: FAILURE 解决办法     jenkins-->configure glo ...

  4. Spark入门1(以WordCount为例讲解flatmap和map之间的区别)

    package com.test import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: ...

  5. Oracle数据库DDL,DML,视图,PLSQL编程

    动手敲~~~ --创建一个表空间--beijing create tablespace beijing datafile 'c:\beijing.dbf' size 100m autoextend o ...

  6. Mybatis 源码分析之事物管理

    Mybatis 提供了事物的顶层接口: public interface Transaction { /** * Retrieve inner database connection * @retur ...

  7. WebSphere部署Spring Boot

    WebSphere Application Server Network Deployment部署 Websphere版本: 8.5.5.12. 这里只简单做操作步骤介绍, 详细的信息请查看IBM的帮 ...

  8. MySQL服务器 IO 100%的案例分析

    [问题] 有台MySQL 5.6.21的数据库实例以写入为主,IO %util接近100% 写入IOPS很高 [分析过程] 1.通过iotop工具可以看到当前IO消耗最高的mysql线程 2.查看线程 ...

  9. Winform 串口通讯之地磅

    继上次的读卡之后,要做一个地磅的读取. 下面是我在读卡Demo上改的读取地磅的. 地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果. 其中遇到了一个小问题,文末有介绍 ...

  10. jQuery学习总结2

    六.动画效果 6.1.基本 hide([speed,[fn]])隐藏显示的元素 speed: 三种预定速度之一的字符串("slow","normal", or ...