SQL調用WebService接口




            今天在做一個非常奇葩的東西。中間有個過程要在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 });
            
        }






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM