一.准备需转为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(); }
三.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格式有应用到。