1. 程式人生 > >PCB MS SQL 標量函式(CLR) 實現DataTable轉HTML的方法

PCB MS SQL 標量函式(CLR) 實現DataTable轉HTML的方法

 一.準備需轉為HMLT字串的DataTable資料

      在資料庫中執行一段SQL返回的資料

          

     需轉換後的HTML的文字

<html ><head></head><body>  <style>          table,table tr th, table tr td { border:1px solid #0094ff;padding: 0px 10px }          table 
{ min-height: 25px; line-height: 25px; text-align: center; border-collapse: collapse;} th {background:green;color:white;} </style> <table><tr><th>TechName</th><th>ItemName</th><th>ItemPara</th></tr><tr><td>開料</
td><td>綜合利用率是否為最高</td><td>/</td></tr><tr><td>開料</td><td>綜合利用率</td><td>68.36</td></tr><tr><td>開料</td><td>緯向餘料</td><td>0</td></tr><tr><td>開料</td><td>經向餘料</td><
td>0</td></tr><tr><td>開料</td><td>是否為小交貨面積拼板</td><td>n</td></tr><tr><td>開料</td><td>緯向尺寸</td><td>24</td></tr><tr><td>開料</td><td>是否為陰陽銅結構</td><td>N</td></tr><tr><td>開料</td><td>是否橫豎開料</td><td>N</td></tr><tr><td>開料</td><td>生產尺寸長</td><td>24</td></tr><tr><td>開料</td><td>生產尺寸寬</td><td>18</td></tr><tr><td>開料</td><td>拼板利用率</td><td>68.36</td></tr><tr><td>開料</td><td>開料圖紙</td><td>/</td></tr><tr><td>開料</td><td>是否顧客指定板材</td><td>N</td></tr><tr><td>開料</td><td>開料數</td><td>4</td></tr><tr><td>開料</td><td>大料經向尺寸</td><td>36</td></tr><tr><td>開料</td><td>大料緯向尺寸</td><td>48</td></tr><tr><td>開料</td><td>成品尺寸長</td><td>12</td></tr><tr><td>開料</td><td>成品尺寸寬</td><td>13.5</td></tr><tr><td>開料</td><td>是否為PTFE板材</td><td>N</td></tr><tr><td>開料</td><td>交貨拼板個數</td><td>1</td></tr><tr><td>開料</td><td>生產拼板個數</td><td>1176</td></tr><tr><td>開料</td><td>交貨單位</td><td>U</td></tr><tr><td>開料</td><td>是否為凹蝕板材</td><td>N</td></tr></table></body></html>

二.C#寫SQL SERVER(CLR)轉HTML函式

     先執行SQL返回DataTable,接著再將DataTable轉為HTML

        /// <summary>  
        ///  SQL轉Html
        /// </summary>  
        /// <param name="StrSQL">SQL語句</param>  
        /// <param name="isTable">是否只轉Table標籤</param>  
        /// <returns></returns>  
        [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
        public static string ExecSQL2Html(string StrSQL, bool isTable)
        {
            DataTable dt = getDataTable(StrSQL);
            return DataTable2Html(dt, isTable);
        }
        /// <summary>
        /// 執行SQL獲取DataTable
        /// </summary>
        /// <param name="StrSQL"></param>
        /// <returns></returns>
        private static DataTable getDataTable(string StrSQL)
        {
            DataTable dt = new DataTable();
            try
            {
                using (SqlConnection cn = new SqlConnection("context connection=true"))
                {
                    using (SqlDataAdapter da = new SqlDataAdapter(StrSQL, cn))
                    {
                        DataSet ds = new DataSet();
                        da.Fill(ds, "tab");
                        dt = ds.Tables["tab"];
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }
            return dt;
        }
        /// <summary>
        /// 將DataTable轉為HTML
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private static string DataTable2Html(DataTable dt, bool isTable = false)
        {
            StringBuilder strHTMLBuilder = new StringBuilder();
            if (!isTable)
            {
                strHTMLBuilder.Append("<html >");
                strHTMLBuilder.Append("<head>");
                strHTMLBuilder.Append("</head>");
                strHTMLBuilder.Append("<body>");
                string style = @"
<style>
        table,table tr th, table tr td { border:1px solid #0094ff;padding: 0px 10px }
        table { min-height: 25px; line-height: 25px; text-align: center; border-collapse: collapse;}   
        th {background:green;color:white;}
         
</style> ";
                strHTMLBuilder.Append(style);
            }
            strHTMLBuilder.Append("<table>");
            strHTMLBuilder.Append("<tr>");
            foreach (DataColumn myColumn in dt.Columns)
            {
                strHTMLBuilder.Append("<th>");
                strHTMLBuilder.Append(myColumn.ColumnName);
                strHTMLBuilder.Append("</th>");
            }
            strHTMLBuilder.Append("</tr>");
            foreach (DataRow myRow in dt.Rows)
            {
                strHTMLBuilder.Append("<tr>");
                foreach (DataColumn myColumn in dt.Columns)
                {
                    strHTMLBuilder.Append("<td>");
                    strHTMLBuilder.Append(myRow[myColumn.ColumnName].ToString());
                    strHTMLBuilder.Append("</td>");
                }
                strHTMLBuilder.Append("</tr>");
            }
            strHTMLBuilder.Append("</table>");
            if (!isTable)
            {
                strHTMLBuilder.Append("</body>");
                strHTMLBuilder.Append("</html>");
            }
            return strHTMLBuilder.ToString();
        }
View Code

三.SQL伺服器CLR配置(允許SQL呼叫.net程式)

    sp_configure 'show advanced options', 1; 
    RECONFIGURE WITH override
    GO 
    sp_configure 'clr enabled', 1; 
    RECONFIGURE WITH override
    GO
    Sp_changedbowner 'sa',true   --sa改為當前登入使用者名稱
    alter database [dbname] set trustworthy on    --bbname 改為自己的庫名

四.註冊 CLR 程式集

   create  ASSEMBLY SQLfunctionAssembly   
   FROM 'D:\SQLClr.dll'      --改為自己C#寫的dll路徑填寫
   WITH PERMISSION_SET = UNSAFE;   

        建立的.net程式集資料會寫入下表:

  select * from sys.assemblies 
  select  * from sys.assembly_files

    

五.建立標量函式

CREATE FUNCTION [dbo].[ExecSQL2Html](@StrSQL [nvarchar](max), @isTable [bit])
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[ExecSQL2Html]

六.測試DataTable轉HTML函式

 執行ExecSQL2HTML函式程式碼

DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT TechName,ItemName,ItemPara 
            FROM FP_EMS_DB.dbo.V_ppegeneral 
            WHERE pdctno = ''2V011Z30A4'' AND TechNo = ''CC_01'' ORDER BY ItemNo '
SELECT  dbo.ExecSQL2HTML(@SQL,0)

 執行後結果返回為HTML文字

<html ><head></head><body>  <style>          table,table tr th, table tr td { border:1px solid #0094ff;padding: 0px 10px }          table { min-height: 25px; line-height: 25px; text-align: center; border-collapse: collapse;}             th {background:green;color:white;}             </style> <table><tr><th>TechName</th><th>ItemName</th><th>ItemPara</th></tr><tr><td>開料</td><td>綜合利用率是否為最高</td><td>/</td></tr><tr><td>開料</td><td>綜合利用率</td><td>68.36</td></tr><tr><td>開料</td><td>緯向餘料</td><td>0</td></tr><tr><td>開料</td><td>經向餘料</td><td>0</td></tr><tr><td>開料</td><td>是否為小交貨面積拼板</td><td>n</td></tr><tr><td>開料</td><td>緯向尺寸</td><td>24</td></tr><tr><td>開料</td><td>是否為陰陽銅結構</td><td>N</td></tr><tr><td>開料</td><td>是否橫豎開料</td><td>N</td></tr><tr><td>開料</td><td>生產尺寸長</td><td>24</td></tr><tr><td>開料</td><td>生產尺寸寬</td><td>18</td></tr><tr><td>開料</td><td>拼板利用率</td><td>68.36</td></tr><tr><td>開料</td><td>開料圖紙</td><td>/</td></tr><tr><td>開料</td><td>是否顧客指定板材</td><td>N</td></tr><tr><td>開料</td><td>開料數</td><td>4</td></tr><tr><td>開料</td><td>大料經向尺寸</td><td>36</td></tr><tr><td>開料</td><td>大料緯向尺寸</td><td>48</td></tr><tr><td>開料</td><td>成品尺寸長</td><td>12</td></tr><tr><td>開料</td><td>成品尺寸寬</td><td>13.5</td></tr><tr><td>開料</td><td>是否為PTFE板材</td><td>N</td></tr><tr><td>開料</td><td>交貨拼板個數</td><td>1</td></tr><tr><td>開料</td><td>生產拼板個數</td><td>1176</td></tr><tr><td>開料</td><td>交貨單位</td><td>U</td></tr><tr><td>開料</td><td>是否為凹蝕板材</td><td>N</td></tr></table></body></html>

HTML文字用流覽器開啟效果

注:此轉換轉為HTML應用場景會後續文章會講到的,利用SQL SERVER 2008資料庫傳送郵件功能實現PCB 自動傳送光繪貼片,將郵件中內容表格資料需轉為HTML格式有應用到。