且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SQL调用WebService接口

更新时间:2022-08-14 14:49:55



            今天在做一个很奇葩的东西,中间有个过程要在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 });
            
        }