Thứ Sáu, 29 tháng 6, 2012

Lấy địa chỉ Ip của client truy cập tới web server ASP.NET, Webservice, WCF

Lấy địa chỉ Ip của client truy cập có thể dùng cho nhiều mục đích khác nhau: thống kê số lượng ip truy cập, chặn ip, 1 user đã sử dụng bao nhiêu địa chỉ ip để đăng nhập website ...

Ứng dụng web ASP.NET thông thường:
  1. string userIp = Request.UserHostAddress;  
Webservice:
  1. string userIp = Context.Request.UserHostAddress;  
WCF:
  1. public string GetClientIp()  
  2. {  
  3.     RemoteEndpointMessageProperty endpoint = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;  
  4.     return endpoint.Address;  
  5. }  

Một demo nhỏ về sử dụng keyword Using trong C#

Using được dùng để khai báo phạm vi sử dụng của một biến. Tuy nhiên chỉ những class được implement từ IDisposable  mới có thể sử dụng được using. Sau khi ra khỏi phạm vi của Using biến khai báo sẽ tự động gọi phương thức Dispose.
Ví dụ:
  1. private void Demo()  
  2. {  
  3.     using (Font font1 = new Font("Arial", 10.0f))  
  4.     {  
  5.         byte charset = font1.GdiCharSet;  
  6.     }  
  7.     //không thấy và sử dụng được biến font1 ở ngoài này  
  8. }  
Lúc này chỉ có thể sử dụng biến font1 ở trong using. Biến font1 sẽ tự động gọi phương thức Dispose trước khi ra khỏi using.
Theo tài liệu MSDN thì đoạn code trên tương đương với:
  1. private void Demo()  
  2. {  
  3.     Font font1 = new Font("Arial", 10.0f);  
  4.     try  
  5.     {  
  6.         byte charset = font1.GdiCharSet;  
  7.     }  
  8.     finally  
  9.     {  
  10.         if (font1 != null)  
  11.             ((IDisposable)font1).Dispose();  
  12.     }  
  13. }  
Điều này cũng có nghĩa nếu return ra khỏi hàm hoặc gặp exception ngay trong using thì phương thức Dispose vẫn sẽ được gọi. Để chứng minh điều này mình đã thử làm ví dụ sau:
Khai báo 1 class implement từ interface IDisposable 
  1. class TestDispose : IDisposable  
  2. {  
  3.     public void Dispose()  
  4.     {  
  5.         Console.Write("Disposed! \n");  
  6.     }  
  7. }  
Khai báo 3 hàm test như sau:
  1. // sử dụng using bình thường  
  2. private static void Test1()  
  3. {  
  4.     Console.WriteLine("Test1");  
  5.     using (TestDispose t = new TestDispose())  
  6.     {  
  7.           
  8.     }  
  9. }  
  10.   
  11. //return ra khỏi hàm trước khi ra khỏi using  
  12. private static void Test2()  
  13. {  
  14.     Console.WriteLine("Test2");  
  15.     using (TestDispose t = new TestDispose())  
  16.     {  
  17.         return;  
  18.     }  
  19. }  
  20.   
  21. // gặp exception trong using  
  22. private static void Test3()  
  23. {  
  24.     Console.WriteLine("Test3");  
  25.     using (TestDispose t = new TestDispose())  
  26.     {  
  27.         throw new Exception("test");  
  28.     }  
  29. }  
Thực hiện test:
  1. static void Main(string[] args)  
  2. {  
  3.     Test1();  
  4.     Test2();  
  5.     try  
  6.     {  
  7.         // hàm này quăng exception nên cần try catch  
  8.         Test3();  
  9.     }  
  10.     catch  
  11.     { }  
  12.     Console.ReadLine();  
  13. }  
Kết quả cả 3 trường hợp phương thức Dispose đều được gọi.

Thứ Năm, 28 tháng 6, 2012

Clear Log File SQL Server DataBase

Database sử dụng lâu ngày file Log sẽ phình to ra, đặc biệt với các database dữ liệu được cập nhập liên tục file log sẽ phình rất nhanh, nếu không kiểm soát sẽ dẫn đến tình trạng full ổ cứng. Lúc này không thể thực hiện được các thao tác ghi dữ liệu. Sử dụng đoạn lệnh sau để clear log cho database:
  1. Alter database [Tên database] set recovery simple with no_wait;  
  2. dbcc shrinkfile([Tên File Log của database], 1);  
  3. Alter database [Tên database] set recovery full with no_wait;  
  4.      

Chủ Nhật, 24 tháng 6, 2012

Write Bitmap to browser C# ASP.NET

Khi có một bitmap object, trong file aspx.cs sử dụng đoạn code sau để write bitmap lên trình duyệt:
  1. Bitmap bmp = GetBitmap();  
  2. this.Response.ContentType = "image/jpg";  
  3. bmp.Save(this.Response.OutputStream, ImageFormat.Jpeg);  
  4.       
Image format trường hợp trên là jpg. Có thể tùy chọn nhiều format khác.

Thứ Sáu, 22 tháng 6, 2012

Sử dụng Cookie trong ASP.NET

Hi hôm trước mình có viết bài về sử dụng cookie bằng js bên phía client.
Đây là đoạn code sử dụng cookie bên phía server asp.net:

  1.     public void SetCookie(string name, string value,int expireDays)    
  2.     {    
  3.         HttpCookie cookie = new HttpCookie(name);    
  4.         cookie.Value = value;    
  5.         cookie.Expires = DateTime.Now.AddDays(expireDays);    
  6.         Response.Cookies.Add(cookie);    
  7.     }    
  8.     
  9.     public HttpCookie GetCookie(string name)    
  10.     {    
  11.        return Request.Cookies[name];    
  12.     }   
  13.       
Xem thêm: Sử dụng Cookie bằng javascript

Một số System Stored Procedure hữu ích trong MS SQL Server

Một số system proc hữu ích:
- sp_help : để lấy thông tin về 1 đối tượng trong database.
Ví dụ: sp_help [table_name] sẽ lấy ra các thông tin, danh sách các column của table. Nếu chỉ sử dụng sp_help mà không có tham số thì sẽ trả về danh sách các object trong database.
- sp_spaceused: trả về thông tin lưu trữ của database hoặc các object trong database.
Ví dụ: sp_spaceused [table_name] trả về thông tin lưu trữ, tổng số dòng của table. Có thể sử dụng sp này để lấy tổng số dòng trong 1 table mà không cần count toàn bộ table. Sử dụng sp_spaceused không có tham số sẽ trả về thông tin lưu trữ của database.
- master..xp_fixeddrives : trả về dung lượng còn trống của ổ cứng máy chủ chứa SQL Server. Cái này rất hay dùng để giám sát dung lượng ổ cứng của server.
- sp_msforeachdb : duyệt tất cả các database, thực hiện câu truy vấn giống nhau cho từng database.
(còn tiếp ...)

Thứ Hai, 18 tháng 6, 2012

Check All và UnCheck All CheckBoxList ASP.NET

Có thể xử lý check all hoặc uncheck all bên phía server hoặc client nhưng mình thích sử dụng javascript trên client hơn vì không phải postback lên server. Đặc biệt nữa là sử dụng javascript thì không phụ thuộc vào công nghệ nào cả, có thể sử dụng cho nhiều công nghệ làm web khác nhau.

Hàm js sử dụng để check all hoặc uncheck all các item trong control CheckBoxList ASP.NET
  1. <script language="javascript" type="text/javascript">  
  2.     function SetAllStateCheckBoxList(chkID, state) {  
  3.         var chk = document.getElementById(chkID);  
  4.         var items = chk.getElementsByTagName("input");  
  5.         for (var i = 0; i < items.length; i++) {  
  6.             items[i].checked = state;  
  7.         }  
  8.     }  
  9. </script>  
  10.       
Sử dụng:
  1. <input type="button" value="chọn hết" onclick="SetAllStateCheckBoxList('<%=CheckBoxList1.ClientID %>',true)" />  
  2. <input type="button" value="bỏ chọn hết" onclick="SetAllStateCheckBoxList('<%=CheckBoxList1.ClientID %>',false)" />  
  3. <asp:CheckBoxList ID="CheckBoxList1" runat="server">  
  4. </asp:CheckBoxList>  
  5.      

Sửa lỗi database bị Suspect trong MS SQL Server

Dùng câu lệnh sau để set ONLINE cho database bị SUSPECT
  1. ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE  
  2.   
  3. GO  
  4.   
  5. DBCC CHECKDB ([DatabaseName], REPAIR_ALLOW_DATA_LOSS)  
  6.   
  7. GO  
  8.   
  9. ALTER DATABASE [DatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE  
  10.   
  11. GO  
  12.   
  13. ALTER DATABASE [DatabaseName] SET ONLINE  
  14.   
  15. GO  
  16.       

Mã hóa MD5 trong C# ASP.NET

Hàm mã hóa MD5 một chuỗi:
  1. public static string GetMD5(string str)  
  2. {  
  3.   
  4.             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
  5.   
  6.             byte[] bHash = md5.ComputeHash(Encoding.UTF8.GetBytes(str));  
  7.   
  8.             StringBuilder sbHash = new StringBuilder();  
  9.   
  10.             foreach (byte b in bHash)  
  11.             {  
  12.   
  13.                 sbHash.Append(String.Format("{0:x2}", b));  
  14.   
  15.             }  
  16.   
  17.             return sbHash.ToString();  
  18.   
  19. }   
  20.       
Tuy nhiên mình rất thích sử dụng theo kiểu Extension:
  1. public static string ToMD5(this string str)  
  2. {  
  3.   
  4.             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
  5.   
  6.             byte[] bHash = md5.ComputeHash(Encoding.UTF8.GetBytes(str));  
  7.   
  8.             StringBuilder sbHash = new StringBuilder();  
  9.   
  10.             foreach (byte b in bHash)  
  11.             {  
  12.   
  13.                 sbHash.Append(String.Format("{0:x2}", b));  
  14.   
  15.             }  
  16.             return sbHash.ToString();  
  17.   
  18. }   
  19.       
Lúc này thay vì :
string str = "abc";
string md5 = GetMD5(str);
mình gọi theo kiểu:
string md5 = str.ToMD5(); thấy pro hơn phải không mọi người. ^^!

Xuất dữ liệu từ DataGridView ra Excel trong ASP.NET ( Export DataGridView To Excel in ASP.NET)

Cái này tham khảo từ các tiền bối thôi ^^!
  1. private static void ExportDataGridViewToExcel(Control dtg, string fileName)  
  2. {  
  3.   
  4.         HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + fileName);  
  5.   
  6.         HttpContext.Current.Response.Charset = "UTF-8";  
  7.   
  8.         HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;  
  9.   
  10.         HttpContext.Current.Response.ContentType = "application/ms-excel";  
  11.   
  12.         dtg.Page.EnableViewState = false;  
  13.   
  14.         System.IO.StringWriter tw = new System.IO.StringWriter();  
  15.   
  16.         System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);  
  17.   
  18.         dtg.RenderControl(hw);  
  19.   
  20.         HttpContext.Current.Response.Write(tw.ToString());  
  21.   
  22.         HttpContext.Current.Response.End();  
  23.   
  24.  }  
  25.       
Note:
Khi gặp báo lỗi

Control '...' of type 'GridView' must be placed inside a form tag with runat=server

thì ở webpage nhớ override lại hàm VerifyRenderingInServerForm là ok.
  1. public override void VerifyRenderingInServerForm(Control control)  
  2. {  
  3.   
  4.   // không làm gì cả  
  5.   
  6. }   
  7.       

Chủ Nhật, 10 tháng 6, 2012

Sự khác nhau giữa Union và Union all trong SQL

^^! Lâu lâu không sử dụng nên note lại cho nhớ:
Union và Union all được sử dụng khi muốn trả về 1 tập hợp bằng việc gom chung lại 2 tập hợp cùng cấu trúc trong sql.
Điểm khác biệt giữa 2 từ khóa là:
- Sử dụng Union sẽ loại bỏ bớt các dòng trùng nhau trước khi trả về kết quả. Số lượng dòng của tập kết quả luôn luôn <= (nhỏ hơn hoặc bằng) tổng số dòng của 2 tập đem gom lại.
- Sử dụng Union all sẽ lấy hết tất cả các dòng của 2 tập hợp đem gom lại. Số lượng dòng của tập kết quả luôn luôn =  (bằng) tổng số dòng của 2 tập đem gom lại.

Sử dụng Cookie bằng javascript

Hôm nay mình làm chức năng đăng nhập bằng javascript, cần sử dụng cookie để lưu trữ thông tin đăng nhập cho phần nhớ mật khẩu. Đây là đoạn code javascript để sử dụng cookie mình tham khảo trên w3schools:
  1. function getCookie(c_name) {  
  2.   
  3.     var i, x, y, ARRcookies = document.cookie.split(";");  
  4.   
  5.     for (i = 0; i < ARRcookies.length; i++) {  
  6.   
  7.         x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));  
  8.   
  9.         y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);  
  10.   
  11.         x = x.replace(/^\s+|\s+$/g, "");  
  12.   
  13.         if (x == c_name) {  
  14.   
  15.             return unescape(y);  
  16.   
  17.         }  
  18.   
  19.     }  
  20.   
  21. }  
  22.   
  23. function setCookie(c_name, value, exdays) {  
  24.   
  25.     var exdate = new Date();  
  26.   
  27.     exdate.setDate(exdate.getDate() + exdays);  
  28.   
  29.     var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());  
  30.   
  31.     document.cookie = c_name + "=" + c_value;  
  32.   
  33. }  
  34.       
Xem thêm Sử dụng Cookie trong ASP.NET