[C#] SQL Server 2008 R2 利用 CLR 呼叫 Web API 2 - 呼叫API

[不專業廢廢筆記] SQL Server 利用 CLR 呼叫 Web API

純筆記  純筆記  純筆記 不是教學文XD

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Net;
using System.Text;
using System.IO;

public partial class Triggers
{        
    // 輸入目標的現有資料表或檢視,並將屬性行取消註解
     [Microsoft.SqlServer.Server.SqlTrigger (Name="CallAPI", Target="test1", Event="FOR UPDATE")]
    public static void CallAPI ()
    {// 以您自己的程式碼取代
        SqlContext.Pipe.Send("K2 API");

        // 克難組一下json...
        StringBuilder json = new StringBuilder();
        string now = DateTime.Now.ToString("yyyyMMddHHmmss");
        json.AppendLine("{\"test\":\"" + now + "\"}");

        // 印出來看一下
        SqlContext.Pipe.Send(json.ToString());


        // 呼叫
        var webAddr = "http://localhost:58162/api/test";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
        httpWebRequest.Method = "POST";
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.ContentLength = json.Length;

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(json);
        }

        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
            SqlContext.Pipe.Send(result);
        }
    }
}

json可以自己寫class 轉換格式

update 的結果

若只限定某個欄位被更新才觸發trigger的話可以用以下方法:

原則上只要table被更新trigger就會被觸發,但觸發時再判斷是否為該欄位

        string _AuditSQL = @"SELECT ins.* FROM   INSERTED ins;";
        SqlCommand _Command = _Connection.CreateCommand();
        _Command.CommandText = _AuditSQL;
        _Connection.Open();
        _Command.ExecuteNonQuery();
        SqlDataReader dr = _Command.ExecuteReader(CommandBehavior.SchemaOnly);

        if (SqlContext.TriggerContext.IsUpdatedColumn(dr.GetOrdinal("column_name")))
        {
            //欄位column_name被update時            
        }
        else
        {
            //非欄位column_name被update時
        }

column_name為被update的tabel的欄位名稱