2014年8月28日 星期四

SQL 2008 資料加密

SQL 2008 資料加密
以下範例建立一個具有儲存加密,讀取解密的資料表

參考網址:
http://dotnetframework.blogspot.tw/2011/01/blog-post.html
http://www.dotblogs.com.tw/dc690216/archive/2009/09/10/10559.aspx


1.建立非對稱金鑰。指定name=mykey, pwd=p@ssw0rd
  1. CREATE ASYMMETRIC KEY mykey
  2. WITH ALGORITHM = RSA_2048
  3. ENCRYPTION BY PASSWORD = 'p@ssw0rd';
  4. GO

2.查詢第1步驟所建立的key是否成功。
  1. select * from sys.asymmetric_keys

3.建立測試資料表

4.建立新增、更新、刪除資料表的預存程序。

  1. USE [EIP_new]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6.  
  7. SET QUOTED_IDENTIFIER ON
  8. GO
  9.  
  10. CREATE PROCEDURE [dbo].[sp_BPM_Modify_t_BPM_Seal_type_E]
  11.  
  12. @action_type NCHAR(1) = '' ,
  13. @id INT = 0,
  14. @username NVARCHAR(50) = '',
  15. @uid NVARCHAR(10) = '',
  16. @pwd NVARCHAR(30) = '',
  17. @sort INT = 0,
  18. @cdt DateTime
  19. AS
  20. BEGIN
  21.  
  22. SET NOCOUNT ON;
  23.  
  24. --傳入資料檢核
  25. IF (@action_type NOT IN ('A','D','U'))
  26. BEGIN
  27. DECLARE @DBID INT;
  28. SET @DBID = DB_ID();
  29. DECLARE @DBNAME NVARCHAR(128);
  30. SET @DBNAME = DB_NAME();
  31. RAISERROR
  32. (N'資料庫 ID:%d, 資料庫名稱: %s。 錯誤訊息:傳入的Action_Mode,必須是 A, U, D 其中一種',
  33. 10, -- Severity.
  34. 1, -- State.
  35. @DBID, -- First substitution argument.
  36. @DBNAME); -- Second substitution argument.
  37. END
  38. --宣告加密用變數
  39. DECLARE
  40. @encryp_uid NVARCHAR(max),
  41. @encryp_pwd NVARCHAR(max),
  42. @encryp_sort NVARCHAR(max)
  43. --SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),@uid)
  44. SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @uid))
  45. --SET @encryp_pwd = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),@pwd)
  46. SET @encryp_pwd = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @pwd))
  47. SET @encryp_sort = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(NVARCHAR(10),@sort))
  48. SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @uid))
  49. --插入
  50. IF (@action_type = 'A')
  51. BEGIN
  52. INSERT INTO t_BPM_Seal_type_E
  53. (
  54. username ,
  55. [uid] ,
  56. pwd ,
  57. sort ,
  58. cdt
  59. )
  60. VALUES
  61. (
  62. @username,
  63. @encryp_uid,
  64. @encryp_pwd,
  65. @encryp_sort,
  66. @cdt
  67. )
  68. END
  69. --更新
  70. IF (@action_type = 'U')
  71. BEGIN
  72. UPDATE t_BPM_Seal_type_E
  73. SET username=@username,
  74. [uid]=@encryp_uid,
  75. pwd=@encryp_pwd,
  76. cdt=@cdt
  77. WHERE id=@id
  78. END
  79. --刪除
  80. IF (@action_type = 'D')
  81. BEGIN
  82. DELETE t_BPM_Seal_type_E
  83. WHERE id=@id
  84. END
  85. END
  86. GO

5.建立檢視資料表,用來讀取被加密的資料表
  1. CREATE VIEW [dbo].[v_BPM_Seal_type_E]
  2. AS
  3. SELECT id, username, CONVERT(NVARCHAR(50), DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), uid, N'p@ssw0rd')) AS uid, CONVERT(NVARCHAR(50),
  4. DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), pwd, N'p@ssw0rd')) AS pwd, CONVERT(NVARCHAR(50),
  5. DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), sort, N'p@ssw0rd')) AS sort, cdt
  6. FROM dbo.t_BPM_Seal_type_E

6.最後查詢被加密的資料表。
上面是未解密原資料表,下面是已解密的檢視(使用第5步驟建立的檢視表)




7.直接查詢,不透過檢視表(View)
  1. Select id,
  2. ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),
  3. CONVERT(nvarchar(max), username)) as '加密'
  4. From dbo.t_BPM_Seal_type_E
  1. Select id,
  2. CONVERT(nvarchar(10), DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), uid, N'p@ssw0rd')) as '解密'
  3. From dbo.t_BPM_Seal_type_E

2014年8月26日 星期二

ASP.NET 將網頁輸出PDF

ASP.NET PDF
將網頁物件輸出至PDF,以下使用Table為例。

1.Download the itextsharp.dll from Internet.
2.Reference of  itextsharp.dll

3.use following references of itextsharp.dll
  1. using iTextSharp.text;
  2. using iTextSharp.text.pdf;
  3. using iTextSharp.text.html.simpleparser;
4.Now the whole code of tsPDF.aspx.cs page will be as follows:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Configuration;
  8. using System.Data.SqlClient;
  9. using System.IO;
  10. using System.Web;
  11. using iTextSharp.text;
  12. using iTextSharp.text.pdf;
  13. using iTextSharp.text.html.simpleparser;
  14.  
  15. public partial class Test_tsPDF : System.Web.UI.Page
  16. {
  17. protected void Page_Load(object sender, EventArgs e)
  18. {
  19. }
  20.  
  21. public override void VerifyRenderingInServerForm(Control control)
  22. {
  23. //required to avoid the runtime error "
  24. //Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server."
  25. }
  26.  
  27. private void ExportGridToPDF()
  28. {
  29. try
  30. {
  31. Response.ContentType = "application/pdf";
  32. Response.AddHeader("content-disposition", "attachment;filename=Vithal_Wadje.pdf");
  33. Response.Cache.SetCacheability(HttpCacheability.NoCache);
  34. StringWriter sw = new StringWriter();
  35. HtmlTextWriter hw = new HtmlTextWriter(sw);
  36. //GridView1.RenderControl(hw);
  37. Table1.RenderControl(hw);
  38. StringReader sr = new StringReader(sw.ToString());
  39. Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
  40. HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
  41. PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
  42. pdfDoc.Open();
  43. htmlparser.Parse(sr);
  44. pdfDoc.Close();
  45. Response.Write(pdfDoc);
  46. Response.End();
  47. GridView1.AllowPaging = true;
  48. GridView1.DataBind();
  49. }
  50. catch (Exception)
  51. {
  52. throw;
  53. }
  54. }
  55.  
  56. protected void Button1_Click(object sender, EventArgs e)
  57. {
  58. ExportGridToPDF();
  59. }
  60. }
5.Now the whole code of tsPDF.aspx page will be as follows:
  1. <body>
  2. <form id="form1" runat="server">
  3. <div>
  4. <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
  5. <asp:GridView ID="GridView1" runat="server"></asp:GridView>
  6. <asp:Table ID="Table1" runat="server">
  7. <asp:TableRow>
  8. <asp:TableCell>Cell 1</asp:TableCell>
  9. <asp:TableCell>Cell 2</asp:TableCell>
  10. <asp:TableCell>Cell 3</asp:TableCell>
  11. <asp:TableCell>Cell 4</asp:TableCell>
  12. <asp:TableCell>Cell 5</asp:TableCell>
  13. <asp:TableCell>Cell 6</asp:TableCell>
  14. </asp:TableRow>
  15. </asp:Table>
  16. </div>
  17. </form>
  18. </body>

Reference website:
http://www.c-sharpcorner.com/UploadFile/0c1bb2/export-gridview-to-pdf/
http://www.cc.ntu.edu.tw/chinese/epaper/0015/20101220_1509.htm

2014年8月12日 星期二

ASP.NET GridView to Excel(GridView輸出到Excel)

ASP.NET GridView to Excel(GridView輸出到Excel)

C#:
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. DataTable dt = new DataTable();
  4. GridView1.DataSource = dt;
  5. GridView1.DataBind();
  6.  
  7. #region HMTL Response
  8. Response.Clear();
  9. Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
  10. Response.AddHeader("content-disposition", "attachment;filename=" + strExportFilename + ".xls");
  11. Response.Cache.SetCacheability(HttpCacheability.NoCache);
  12. Response.ContentType = "application/vnd.xls";
  13. //Response.Charset = "big5"; //utf-8
  14. Response.Charset = "utf-8"; //utf-8
  15. //Response.ContentEncoding = System.Text.Encoding.GetEncoding(950); //65001
  16. Response.ContentEncoding = System.Text.Encoding.GetEncoding(65001); //65001
  17.  
  18. System.IO.StringWriter stringWrite = new System.IO.StringWriter();
  19. System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
  20. GridView1.RenderControl(htmlWrite); //將物件GridView1輸出
  21. //Table1.RenderControl(htmlWrite); //將物件Table1輸出
  22. Response.Write(stringWrite.ToString().Replace("<div>", "").Replace("</div>", ""));
  23. Response.End();
  24. #endregion
  25. }

ASP.NET 型別 'GridView' 的控制項 'GridView1' 必須置於有 runat=server 的表單標記之中

ASP.NET 型別 'GridView' 的控制項 'GridView1' 必須置於有 runat=server 的表單標記之中



在.cs中加入下段即可
  1. public override void VerifyRenderingInServerForm(Control control)
  2. {
  3. //處理'GridView' 的控制項 'GridView' 必須置於有 runat=server 的表單標記之中
  4. }

Ref
http://social.msdn.microsoft.com/Forums/zh-TW/fc860a06-bb14-40fd-bced-9d86af5d9653/gridviewexcel?forum=236

2014年8月7日 星期四

ASP.NET 取得GridView Cells下所有Label物件

ASP.NET 取得GridView Cells下所有Label物件

C#:
  1. protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  2. {
  3. try
  4. {
  5. if (e.Row.RowType != DataControlRowType.DataRow) // 非資料行, 離開
  6. return;
  7.  
  8. //單筆, 取得指定名稱Label物件, 若Text="n/a", 將Text改為空白
  9. Label lblGvptz_zoom = e.Row.FindControl("lblGvptz_zoom") as Label;
  10. if (lblGvptz_zoom.Text.Equals("n/a"))
  11. lblGvptz_zoom.Text = "";
  12.  
  13. //多筆迴圈, 取得Row下所以Cells中的Label物件, 若Text="n/a", 將Text改為空白
  14. foreach (TableCell cl in e.Row.Cells)
  15. {
  16. foreach (object ctrl in cl.Controls)
  17. {
  18. if (ctrl is System.Web.UI.WebControls.Label) //判斷ctrl是否為Label物件
  19. {
  20. Label lblctrl = (Label)ctrl;
  21. if (lblctrl.Text.Equals("n/a"))
  22. lblctrl.Text = "";
  23. }
  24. }
  25. }
  26. }
  27. catch (Exception)
  28. {
  29. throw;
  30. }
  31. }

2014年8月5日 星期二

T-SQL Cannot create a row of size 9440 which is greater than the allowable maximum row size of 8060

T-SQL Cannot create a row of size 9440 which is greater than the allowable maximum row size of 8060

StoredProcedure寫了一段PIVOT時出現的錯誤訊息
錯誤原因是其中有一個欄位長度超過8060,解決方法將原來nvarchar(max)改為==>nvarchar(4000)即可

下段StoredProcedure其中text1使用了nvarchar(max)


將text1改為nvarchar(4000)即可






2014年8月4日 星期一

T-SQL Stored Procedure使用條件式 IN

T-SQL Stored Procedure使用條件式 IN

How to pass string parameter with `IN` operator in stored procedure

(1)T-SQL (sp_ATS_ComparisonPIVOT) 主要預存程序
傳入參數:@model = N'A1234,B1234'
  1. CREATE PROCEDURE [dbo].[sp_ATS_ComparisonPIVOT]
  2. @model nvarchar(max)
  3. AS
  4. declare @ColumnGroup nvarchar(max),
  5. @PivotSQL nvarchar(max)
  6. BEGIN
  7. SET NOCOUNT ON;
  8. select @ColumnGroup = COALESCE(@ColumnGroup + ',' ,'' ) + QUOTENAME(model)
  9. FROM t_ATS_spec
  10. --請看下一行範例
  11. where model in (Select data From dbo.fn_slip_str(@model,','))
  12. GROUP BY QUOTENAME(model)
  13. select @ColumnGroup
  14. SELECT @PivotSQL = N'
  15. SELECT *
  16. FROM (SELECT technicalspecification,name,model,text1 FROM t_ATS_spec) AS SourceTable
  17. PIVOT
  18. (max(text1)
  19. FOR
  20. model IN (' + @ColumnGroup + N')
  21. ) AS PivotTable'
  22. exec(@PivotSQL)
  23.  
  24. END



(2)T-SQL(Function fn_slip_str)搭配字串分割程序使用
  1. Create Function fn_slip_str( @InStr nvarchar(2000) , @s_char nvarchar(1) )
  2. Returns @tb Table ( sno int , data nvarchar(100) )
  3. As
  4. Begin
  5. /*依據傳入字元進行字串分割,回傳Table*/
  6. /*
  7. Declare @InStr nvarchar(2000) , @s_char nvarchar(1);
  8. Set @InStr = '字串一,字串2,字串3,字串4';
  9. Set @s_char = ',';*/
  10.  
  11. Set @InStr = @s_char + @InStr + @s_char;
  12. Declare @p1 Int , @p2 Int , @data nvarchar(100) , @sno int;
  13. Set @p1 = -1 ; Set @p2 = -1 ; Set @data = '' ; Set @sno = 0;
  14. While ( 0 Not In (@P1,@P2) ) Begin
  15. Set @p1 = CharIndex(@s_char,@InStr,@p1+1);
  16. Set @p2 = CharIndex(@s_char,@InStr,@p1+1);
  17. If ( 0 In (@p1,@p2) )
  18. Break;
  19. Set @data = SubString(@InStr,@p1+1,@p2-@p1-1);
  20. if ( @data <> '' ) Begin
  21. Set @sno = @sno +1;
  22. Insert Into @tb ( sno , data ) Values ( @sno , @data )
  23. End
  24. End
  25. Return
  26. End

(3)執行結果:
  1. Select * From dbo.fn_slip_str('字串一,字串2,字串3,字串4',',');

Ref WebSite
http://www.dotblogs.com.tw/rachen/archive/2008/05/23/4110.aspx

T-SQL字串分割

T-SQL字串分割

T-SQL code(backup):
  1. Create Function fn_slip_str( @InStr nvarchar(2000) , @s_char nvarchar(1) )
  2. Returns @tb Table ( sno int , data nvarchar(100) )
  3. As
  4. Begin
  5. /*依據傳入字元進行字串分割,回傳Table*/
  6. /*
  7. Declare @InStr nvarchar(2000) , @s_char nvarchar(1);
  8. Set @InStr = '字串一,字串2,字串3,字串4';
  9. Set @s_char = ',';*/
  10.  
  11. Set @InStr = @s_char + @InStr + @s_char;
  12. Declare @p1 Int , @p2 Int , @data nvarchar(100) , @sno int;
  13. Set @p1 = -1 ; Set @p2 = -1 ; Set @data = '' ; Set @sno = 0;
  14. While ( 0 Not In (@P1,@P2) ) Begin
  15. Set @p1 = CharIndex(@s_char,@InStr,@p1+1);
  16. Set @p2 = CharIndex(@s_char,@InStr,@p1+1);
  17. If ( 0 In (@p1,@p2) )
  18. Break;
  19. Set @data = SubString(@InStr,@p1+1,@p2-@p1-1);
  20. if ( @data <> '' ) Begin
  21. Set @sno = @sno +1;
  22. Insert Into @tb ( sno , data ) Values ( @sno , @data )
  23. End
  24. End
  25. Return
  26. End

執行結果:
  1. Select * From dbo.fn_slip_str('字串一,字串2,字串3,字串4',',');

下段程式原始來源請參考下列網址(如有侵權請告知):
http://www.dotblogs.com.tw/rachen/archive/2008/05/23/4110.aspx