Thứ Năm, 20 tháng 12, 2012

Tìm danh sách các Store Procedure,View có liên quan đến Table nào đó trong MS SQL Server

Hôm nay mình cấu trúc lại database nên cần chỉnh sửa 1 số tên cột, xóa 1 số bảng không còn dùng nữa ra khỏi database.

Một điều khá mệt là hệ thống mình kết nối dữ liệu tới database đều sử dụng Store Proc hết, số lượng store proc rất nhiều. Khi sửa tên cột trong table, các store proc nào có gọi đến tên cột của table nó không tự động đổi cho nên khi gọi store proc này sẽ báo lỗi. Thêm 1 điều nữa là khi quyết định xóa 1 table mình phải chắc chắn không có store proc hay view nào đang dùng tới nó.

Sử dụng đoạn lệnh sau để tìm các store proc, view có sử dụng table muốn sửa hay muốn xóa:
  1. use [Database Name]  
  2. SELECT DISTINCT o.name, o.xtype  
  3. FROM syscomments c  
  4. INNER JOIN sysobjects o ON c.id=o.id  
  5. WHERE c.TEXT LIKE '%tableName%'      
Hoặc
SELECT o.name, o.xtype, m.definition
FROM sys.sql_modules  m  
INNER JOIN sysobjects o ON m.object_id = o.id 
WHERE m.definition LIKE '%tableName%' 
Cách làm này có thể không chính xác tuyệt đối (tìm trong nội dung có chứa tên của table) nhưng cũng khá hiệu quả.

Thứ Hai, 10 tháng 12, 2012

Xóa các thẻ Html ra khỏi 1 chuỗi (lấy InnerText của 1 thẻ Html)

Khi có 1 object HtmlElement (System.Windows.Forms) hay HtmlNode (HtmlAgilityPack) thì việc lấy InnerText của nó khá đơn giản, chỉ cần .InnerText là ra.

Trường hợp có 1 thẻ Html nhưng ở dạng chuỗi thì sử dụng regular expression để replace những đoạn có cấu trúc là 1 tag mở hay tag đóng của 1 thẻ Html.

Có rất nhiều mẫu để tìm tag html ví dụ "<[^>]*>" hoặc "<.*?>" . Trường hợp này mình dùng mẫu  "<[^>]*>":
  1. public static string RemoveHtml(this string text)  
  2. {  
  3.     return Regex.Replace(text, "<[^>]*>", string.Empty);  
  4. }  
Test:
  1. string link = "<a href=\"http://www.hanhtranglaptrinh.com/2012/11/goi-ham-javascript-bang-webbrowser.html\">Gọi hàm Javascript bằng webbrowser control C#</a>";  
  2. string anchorText = link.RemoveHtml();//Gọi hàm Javascript bằng webbrowser control C#  

Thứ Ba, 27 tháng 11, 2012

Gọi hàm Javascript bằng webbrowser control C#

Hum nay ngồi làm cái chương trình quét dữ liệu tự động sử dụng webbrowser control.

Do dữ liệu nhiều lên website nó phân trang, sau khi lấy hết dữ liệu của trang hiện tại mình phải tìm đúng cái link để qua trang kế và tự động click vào hoặc lấy url của nó để chuyển đến trang kế.

Ngồi Inspect Element ai ngờ nó sử dụng javascript để qua trang kế ^^. Thay vì phải tìm link này để click vào thì mình dùng webbrowser control gọi trực tiếp hàm javascript này.


Sử dụng webbrowser control để gọi javascript qua trang kế:
  1. private void GoToPage(int page)  
  2. {  
  3.     webBrowser.Document.InvokeScript("gotoPage", new object[] { page });  
  4. }  
Cách làm này đỡ mất công phải tìm đúng thẻ để gọi phương thức click, có thể tăng tự động page thêm 1 sau mỗi trang hoặc nhảy đến 1 trang bất kỳ tùy thích để lấy dữ liệu ^^!.

Xem thêm Điền dữ liệu và tự động click vào button trên website sử dụng webbrowser control c#

Thứ Hai, 19 tháng 11, 2012

Cấu hình thông báo lỗi 404 Directory not found (Không tìm thấy thư mục) cho website trên IIS

Cấu hình thông báo lỗi cho website là điều cần thiết. Trong nhiều trường hợp sẽ che dấu đi lỗi code, version của IIS, .Net Framework,... tránh trường hợp tò mò của những kẻ xấu hoặc hacker lợi dụng các lỗi code hoặc điểm yếu của phiên bản server để khai thác lỗ hổng và phá hoại.

Mình đã có 1 bài viết về cấu hình thông báo lỗi cho website khi truy cập vào 1 file hoặc thư mục không tồn tại trong website.

Tuy nhiên khi mình đưa website lên host (Đã thử trên cả IIS 6 và IIS 7) nó chỉ có tác dụng đối với file .aspx không tồn tại, còn đối với trường hợp người dùng truy cập vào 1 số kiểu file khác hoặc một thư mục không tồn tại thì vẫn bị báo lỗi. Cách khắc phục là cần cấu hình thêm.

Cách 1: Cấu hình trên IIS 7

Trên IIS 6 thì tương tự:

Cách 2: Cấu hình trong web.config IIS7 <system.webServer> </system.webServer>:
(Khi cấu hình trên IIS7 sau đó mở web.config lên sẽ tìm thấy đoạn này)
  1. <httpErrors>  
  2.   <remove statusCode="404" subStatusCode="-1" />  
  3.   <error statusCode="404" prefixLanguageFilePath="" path="http://hanhtranglaptrinh.com" responseMode="Redirect" />  
  4. </httpErrors>  
Chú ý:
Khi test phải publish website lên IIS hoặc hosting. Trường hợp chạy website bằng server ảo do Visual Studio dựng lên kết quả sẽ không chính xác.

Chủ Nhật, 18 tháng 11, 2012

Lấy thông tin dung lượng phân vùng ổ cứng của máy tính bằng C#

Mình có viết 1 cái tool nho nhỏ để check dung lượng ổ cứng của server, mỗi khi dung lượng trống xuống dưới một mức nào đó thì báo động (email,sms ) cho người quản lý vào kiểm tra. Dưới đây là hướng dẫn và demo đơn giản về cách làm:

Add using System.Runtime.InteropServices; và sử dụng DLL Import:
  1. [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]  
  2. private static extern long GetDiskFreeSpaceEx(  
  3. string lpDirectoryName, out long lpFreeBytesAvailableToCaller,  
  4. out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);  
Sử dụng:
  1. long result, total, free, available;  
  2. result = GetDiskFreeSpaceEx("d:", out available, out total, out free);  
  3.   
  4. if (result != 0)  
  5. {  
  6.     long totalGB = total / (1024 * 1024 * 1024);  
  7.     long freeGB = free / (1024 * 1024 * 1024);  
  8.     long availableGB = available / (1024 * 1024 * 1024);  
  9.     string mess = "Tổng số GB: " + totalGB + "\n";  
  10.     mess += "Tổng số GB trống: " + freeGB + "\n";  
  11.     mess += "Tổng số GB trống xài được: " + availableGB;  
  12.     MessageBox.Show(mess);  
  13. }  
Vì kết quả trả về với đơn bị là byte nên mình chuyển qua GB.

Demo:
Sự kiện Form Load khai báo như sau ( dưới đây lấy thông tin của phân vùng D):

Kết quả:

Dưới đây là thông tin Hard Disk Drives máy mình tại thời điểm làm demo này:

Thứ Hai, 12 tháng 11, 2012

Tìm thứ 2 và thứ 7 trong tuần của 1 ngày bất kỳ

Mình cần làm một công việc thống kê dữ liệu trong tuần từ thứ 2 đến thứ 7 nên cần tìm ra ngày thứ 2 và thứ 7 trong tuần của 1 ngày bất kỳ.

Ở đây mình không dám đặt tên hàm là First hay End Of Week vì vấn đề ngày Chủ Nhật có nơi coi là ngày đầu tuần, nhưng có nơi coi là ngày cuối tuần.

Trường hợp này mình xét ngày Chủ Nhật là ngày cuối tuần:
  1. public static DateTime MondayOfWeek(this DateTime date)  
  2. {  
  3.     var dayOfWeek = date.DayOfWeek;  
  4.   
  5.     if (dayOfWeek == DayOfWeek.Sunday)  
  6.     {  
  7.         //xét chủ nhật là đầu tuần thì thứ 2 là ngày kế tiếp nên sẽ tăng 1 ngày  
  8.         //return date.AddDays(1);  
  9.   
  10.         // nếu xét chủ nhật là ngày cuối tuần  
  11.         return date.AddDays(-6);  
  12.     }  
  13.   
  14.     // nếu không phải thứ 2 thì lùi ngày lại cho đến thứ 2  
  15.     int offset = dayOfWeek - DayOfWeek.Monday;  
  16.     return date.AddDays(-offset);  
  17. }  
  18.   
  19. public static DateTime SaturdayOfWeek(this DateTime date)  
  20. {  
  21.     return date.MondayOfWeek().AddDays(5);  
  22. }  

Thứ Tư, 7 tháng 11, 2012

Hàm bỏ dấu tiếng việt trong C#

Bỏ dấu bằng cách replace các ký tự có dấu về ký tự không dấu tương ứng:
  1. public static string RemoveUnicode(string text)  
  2. {  
  3.     string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",  
  4.     "đ",  
  5.     "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
  6.     "í","ì","ỉ","ĩ","ị",  
  7.     "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
  8.     "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
  9.     "ý","ỳ","ỷ","ỹ","ỵ",};  
  10.     string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",  
  11.     "d",  
  12.     "e","e","e","e","e","e","e","e","e","e","e",  
  13.     "i","i","i","i","i",  
  14.     "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",  
  15.     "u","u","u","u","u","u","u","u","u","u","u",  
  16.     "y","y","y","y","y",};  
  17.     for (int i = 0; i < arr1.Length; i++)  
  18.     {  
  19.         text = text.Replace(arr1[i], arr2[i]);  
  20.         text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());  
  21.     }  
  22.     return text;  
  23. }  
Viết theo kiểu Extension:
  1. public static string NonUnicode(this string text)  
  2. {  
  3.     string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",  
  4.     "đ",  
  5.     "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
  6.     "í","ì","ỉ","ĩ","ị",  
  7.     "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
  8.     "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
  9.     "ý","ỳ","ỷ","ỹ","ỵ",};  
  10.     string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",  
  11.     "d",  
  12.     "e","e","e","e","e","e","e","e","e","e","e",  
  13.     "i","i","i","i","i",  
  14.     "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",  
  15.     "u","u","u","u","u","u","u","u","u","u","u",  
  16.     "y","y","y","y","y",};  
  17.     for (int i = 0; i < arr1.Length; i++)  
  18.     {  
  19.         text = text.Replace(arr1[i], arr2[i]);  
  20.         text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());  
  21.     }  
  22.     return text;  
  23. }  
Test:
  1. string test1 = "hành trang lập trình chấm cơm".NonUnicode();  
  2. string test2 = Functions.RemoveUnicode("hành trang lập trình chấm cơm");