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

Toán tử ? : trong C#

Cái này lúc đầu thấy hơi khó sử dụng nhưng sử dụng nhiều thấy cũng hay và code ngắn gọn:
Cú pháp: điều kiện ? giá trị trả về nếu thỏa điều kiện : giá trị trả về nếu không thỏa điều kiện
Ví dụ:
  1. int i = 5;  
  2. string test = i < 0 ? "i bé hơn 0" : "i lớn hơn 0";  
Đoạn code trên tương đương với:
  1. int i = 5;  
  2. string test;  
  3. if (i < 0)  
  4. {  
  5.     test = "i bé hơn 0";  
  6. }  
  7. else  
  8. {  
  9.     test = "i lớn hơn 0";  
  10. }  
Có thể sử dụng kết hợp:
  1. int i = -5;  
  2. string test = i < 0 ? "i bé hơn 0" + (i < -1 ? " và i bé hơn -1" : "") : "i lớn hơn 0";  
Nguồn:MSDN

Thứ Hai, 16 tháng 7, 2012

Sử dụng phương thức TryParse khi convert object

Khi muốn convert 1 object nguồn thành 1 object đích ta thường sử dụng các phương thức tĩnh Parse hoặc TryParse có sẵn của object đích để convert object nguồn thành object đích.
 - Sử dụng phương thức Parse. Nếu object nguồn không đúng định dạng và không thể convert được thành object đích thì sẽ throw exception lên. Để tránh lỗi và biết được có convert thành công hay không chúng ta cần phải sử dụng try catch.
 - Sử dụng phương thức TryParse sẽ trả về object kết quả, đồng thời báo cho ta biết có convert thành công hay không. Nếu object nguồn không đúng định dạng và không thể convert được thành object đích thì sẽ trả về kết quả không thành công.
- Cách sử dụng TryParse:
  1. DateTime dateTime;  
  2. if (DateTime.TryParse("abc"out dateTime))  
  3. {  
  4.     // thành công, biến dateTime đã có thể sử dụng được 
  5. }  
  6. else  
  7. {  
  8.     // thất bại  
  9. }  
- Đoạn code trên tương đương với:
  1. DateTime dateTime;  
  2. try  
  3. {  
  4.     dateTime = DateTime.Parse("abc");  
  5. }  
  6. catch  
  7. {  
  8.   
  9. }  
- Tùy từng trường hợp xử lý khác nhau mà có thể áp dụng các cách làm khác nhau. Nhưng nếu chỉ muốn kiểm tra dữ liệu có hợp lệ hay không để quyết định các bước xử lý tiếp theo thì sử dụng TryParse là một lợi thế, code sẽ ngắn gọn và dễ hiểu hơn nhiều.

Ghi thêm dữ liệu vào cuối file đã tồn tại

Khi khai báo 1 StreamWrite để ghi file sử dụng StreamWriter(string path, bool append) hoặc File.AppendText(string path) để cho biết rằng nếu file đã tồn tại thì dữ liệu sẽ được ghi tiếp vào cuối file chứ không chép đè lên file cũ. Nếu file chưa tồn tại sẽ tạo file mới.

Demo:
  1. // cách 1  
  2. using (StreamWriter sw = new StreamWriter("abc.txt"true))  
  3. {  
  4.     sw.WriteLine(DateTime.Now.ToString() + Environment.NewLine);  
  5. }  
  6.   
  7. // cách 2  
  8. using (StreamWriter sw = File.AppendText("abc.txt"))  
  9. {  
  10.     sw.WriteLine(DateTime.Now.ToString() + Environment.NewLine);  
  11. }  

Chủ Nhật, 15 tháng 7, 2012

Ký tự xuống dòng ( new line character ) trong MS SQL

Sử dụng char(10) hoặc char(13) để trả về ký tự xuống dòng.
Ví dụ:
  1. select 'abc' + char(10) +'def'  
  2.   
  3. select 'abc' + char(13) +'def'  
  4.       
Test:
  1. string test1 = connTest.ExecuteScalar("select 'abc' + char(10) +'def'").ToString();  
  2. string test2 = connTest.ExecuteScalar("select 'abc' + char(13) +'def'").ToString();  
Kết quả:
test1 = "abc\ndef" và test2 = "abc\rdef"

Thứ Hai, 2 tháng 7, 2012

Tổng hợp các hàm xử lý chuỗi trong MS SQL Server

Mình làm một bài viết về danh sách các hàm hệ thống xử lý chuỗi trong SQL. Danh sách các hàm xử lý này mọi người có thể tìm trên MSDN hoặc trong phần System Functions trong mỗi database SQL.

1. Hàm Ascii

  1. -- 1. Ascii  
  2. -- trả về mã ascii của ký tự  
  3. select ascii('A')  
  4. -- kết quả: 65      
2. Hàm Char
  1. -- 2. Char   
  2. -- trả về ký tự của mã ASCII  
  3. select char(65)  
  4. -- kết quả: A    
3. Hàm charindex
  1. -- 3. charindex  
  2. -- trả về vị trí xuất hiện của 1 chuỗi con trong 1 chuỗi bắt đầu từ 1 vị trí xác định  
  3. select charindex('abc','cabcaaaa',2)  
  4. -- giải thích: từ vị trí số 2 của chuỗi 'cabcaaaa' tức là từ ký tự 'a' trở đi tìm vị trí xuất hiện của chuỗi 'abc'  
  5. -- kết quả là chuỗi 'abc' xuất hiện ở vị trí ký tự thứ 2 của chuỗi 'cabcaaaa'       
4. Hàm Left
  1. -- 4. left  
  2. -- lấy ra n ký tự đầu tiên của chuỗi.  
  3. select left('123456',3)  
  4. -- ví dụ: lấy ra 3 ký tự đầu tiên của chuỗi '123456'  
  5. -- kết quả: '123'       
5. Hàm Right
  1. -- 5. right  
  2. -- lấy ra n ký tự cuối cùng của chuỗi  
  3. -- ví dụ: lấy ra 3 ký tự cuối cùng của chuỗi '123456'  
  4. select right('123456',3)  
  5. -- kết quả: '456'  
6. Hàm Len
  1. -- 6. len()  
  2. -- trả về số lượng ký tự hay độ dài của chuỗi  
  3. select len('abcd')  
  4. -- kết quả: 4    
7. Hàm Lower
  1. -- 7. lower  
  2. -- viết thường tất cả các ký tự  
  3. select lower('aaBBcCdGG')  
  4. -- kết quả: aabbccdgg    
8. Hàm Upper
  1. -- 8. upper  
  2. -- viết hoa tất cả các ký tự  
  3. select upper('aaBBcCdGG')  
  4. -- kết quả: AABBCCDGG       
9. Hàm LTrim
  1. -- 9. Ltrim  
  2. -- Xóa tất cả các ký tự rỗng, khoảng trắng ở ĐẦU chuỗi.  
  3. select Ltrim('     abc     ')  
  4. -- kết quả: 'abc     '       
10. Hàm RTrim
  1. -- 10. Rtrim  
  2. -- Xóa tất cả các ký tự rỗng, khoảng trắng ở CUỐI chuỗi.  
  3. select Rtrim('     abc     ')  
  4. -- kết quả: '     abc'    
11. Hàm PatIndex
  1. -- 11. patindex  
  2. -- trả về vị trí xuất hiện của 1 mẫu trong 1 chuỗi  
  3. SELECT PATINDEX('%ensure%''please ensure the door is locked');  
  4. -- kết quả: 8  
  5. -- note: sử dụng ký tự _ để thay thế cho 1 ký tự bất kỳ  
  6. SELECT PATINDEX('%en_ure%''please ensure the door is locked');  
  7. -- kết quả vẫn là: 8  
12. Hàm Quote
  1. -- 12. quotename  
  2. -- trích dẫn  
  3. select quotename('hanh trang lap trinh dot com')  
  4. -- kết quả: [hanh trang lap trinh dot com]  
  5. -- có thể đổi ký tự trích dẫn khác như :ngoặc đơn ( hay dấu nháy '  
  6. select quotename('hanh trang lap trinh dot com',')')  
  7. -- kết quả: (hanh trang lap trinh dot com)  
13. Hàm Replace
  1. -- 13. replace  
  2. -- thay thế tất cả các chuỗi con nào đó trong 1 chuỗi thành 1 chuỗi con khác  
  3. select replace('hanh trang lap trinh dot com accom','com','net')  
  4. -- Tất cả các từ 'com' trong chuỗi sẽ được thay bằng từ 'net'  
  5. -- Kết quả: hanh trang lap trinh dot net acnet  
14. Hàm replicate
  1. -- 14. replicate  
  2. -- nhân 1 chuỗi lên nhiều lần  
  3. select replicate('acb',5)  
  4. -- chuỗi 'acb' được lặp lại 5 lần.  
  5. -- kết quả: acbacbacbacbacb    
15. Hàm Reverse
  1. -- 15. reverse  
  2. -- quay ngược chuỗi lại  
  3. select reverse('abcdef')  
  4. -- kết quả: fedcba  
16. Hàm Space
  1. -- 16. space  
  2. -- trả về 1 chuỗi gồm n ký tự khoảng trắng.  
  3. select 'a' +space(54) +'b'  
  4. -- kết quả: 'a                                                      b'  
  5. -- ký tự a + 54 ký tự khoảng trắng + ký tự b  
17. Hàm Str
  1. -- 17. Str  
  2. -- chuyển một số thành một chuỗi. Hàm này rắc rối, mình chưa biết ích lợi để làm gì nữa.  
  3. select str(5.333333,20,2)  
  4. -- giải thích: chuyển số 5.333333 thành chuỗi có độ dài là 20 ký tự, chỉ lấy 2 ký tự thập phân sau dấu '.'  
  5. -- nếu số trên khi chuyển thành chuỗi mà chưa đủ 20 ký tự thì sẽ tự thêm các khoảng trắng vào phía trước sao cho đủ 20 ký tự.  
  6. -- kết quả: '                5.33'  
  7.   
  8. -- nếu số lượng chữ số phần nguyên của số mà nhiều hơn độ dài chuỗi trả về thì sẽ trả về các giá trị là ký tự '*'  
  9. select str(5555.333333,3,2)  
  10. -- kết quả trả về là 3 ký tự '*' : '***' vì độ dài chuỗi trả về là 3 trong khi số lượng chữ số phần nguyên là 4.  
18. Hàm Stuff
  1. -- 18. stuff  
  2. -- hàm này sẽ thay thế n ký tự bắt đầu từ 1 vị trí xác định bằng 1 chuỗi muốn thay vào  
  3. SELECT STUFF('abcdef', 2, 3, 'ijklmn');  
  4. -- giải thích: từ vị trí 2 tức là ký tự 'b' lấy ra 3 ký tự -> 'bcd' và thay thế bằng 'ijklmn'   
  5. -- kết quả: aijklmnef   
19. Hàm Substring
  1. -- 19. substring  
  2. -- cắt ra 1 chuỗi nhỏ từ chuỗi ban đầu  
  3. select substring('abcdefgh',2,5)  
  4. -- giải thích: từ vị trí thứ 2 lấy ra 5 ký tự liên tiếp  
  5. -- kết quả: bcdef  
20. Hàm Unicode
  1. -- 20. unicode  
  2. -- trả về giá trị unicode của ký tự đầu tiên của chuỗi  
  3. select unicode(N'Áac')  
  4. -- kết quả: 193  
21. Hàm NChar
  1. -- 21. Nchar  
  2. -- trả về ký tự unicode của mã unicode  
  3. select Nchar( unicode(N'Áac'))  
  4. select Nchar( 193)  
  5. -- kết quả cả 2 câu truy vấn đề là : Á    
22. Hàm Soundex
  1. -- 22. soundex  
  2. -- Soundex là một thuật toán ngữ âm để liệt kê các từ theo âm sắc, theo cách phát âm của tiếng Anh. Mục đích là mã hóa những từ có cùng cách phát âm qua những đặc trưng giống nhau, từ đó người ta có thể tìm được một từ nào đó dù có sai sót nhỏ trong chính tả từ đó  
  3. select soundex('Brothers')  
  4. -- kết quả là 1 chuỗi gồm 4 ký tự: B636. Ký tự đầu tiên của kết quả cũng chính là ký tự đầu tiên của chuỗi ban đầu  
23. Hàm Difference
  1. -- 23. difference  
  2. -- hàm trả về số lượng ký tự giống nhau của 2 chuỗi sau khi đã mã hóa soundex. Giá trị kết quả nằm trong khoảng từ 0 đến 4  
  3. select difference('Brothers','Brothers')  

Chủ Nhật, 1 tháng 7, 2012

Cộng chuỗi với số trong MS Sql ?

Hi như chúng ta đã quen với việc lập trình C# khi cộng 1 chuỗi với 1 số thì kết quả trả về sẽ là một chuỗi. Hôm nay ngồi viết câu truy vấn dưới sql thì phát hiện 1 điều ngược lại.
Khi select 1 chuỗi + với 1 số sql sẽ cố convert qua kiểu số. Nếu chuỗi không thể convert được qua kiểu số thì câu truy vấn sẽ báo lỗi.

Ví dụ trên C#:
  1. object o1 = "0111" + 5;  
  2. // kết quả sẽ là "01115"  
  3.   
  4. object o2 = "0111aa" + 5;  
  5. // kết quả sẽ là "0111aa5"  
Trong Sql:
  1. select '0111' + 5  
  2. -- kết quả 116  
  3.  
  4. select '0111aa' + 5  
  5. -- báo lỗi: Conversion failed when converting the varchar value '0111aa' to data type int
Nếu muốn truy vấn thành công bắt buộc phải ép số về chuỗi.

  1. select '0111aa' + cast(5 as varchar)  
  2. -- kết quả: 0111aa5  

Tự động điền dữ liệu vào texbox và click vào button trong webbrowser control C#

Hôm nay làm cái tool lấy dữ liệu tự động từ 1 trang web. Công việc cần làm là điền dữ liệu input vào 1 textbox sau đó bấm vào button để lấy kết quả trả về. Mình sử dụng webbrowser control giả lập người dùng điền dữ liệu và bấm vào nút lấy kết quả. Sẵn tiện chia sẻ với mọi người cách làm, có thể sử dụng để làm chức năng đăng nhập, post bài tự động.

Để điền dữ liệu vào textbox ta làm như sau:
  1. private void SetText(string elementId, WebBrowser webbrowser, string text)  
  2. {  
  3.     HtmlElement element = webbrowser.Document.GetElementById(elementId);  
  4.     element.InnerText = text;  
  5. }  
Để click vào button sử dụng hàm sau:
  1. private void InvokeClick(string elementId,WebBrowser webbrowser)  
  2. {  
  3.     HtmlElement element = webbrowser.Document.GetElementById(elementId);  
  4.     element.InvokeMember("click");  
  5. }  
Trong đó elementId chính là giá trị của attribute id của thẻ html. Làm sao để có giá trị này thì có thể sử dụng chức năng inspect element của chrome hay các addon của firefox để tìm ^^!.

Mình làm 1 ví dụ về chức năng tự động đăng nhập vào 1 trang web như sau:
- Đầu tiên tìm id của thẻ html nhập username. Ở đây mình giả sử là: txtUserName.
- Tìm id của thẻ html nhập password. Ở đây mình giả sử là txtPassword.
- Tìm id của button đăng nhập. Ở đây mình giả sử là btnLogin.
  1. // chuyển đến trang đăng nhập  
  2. webBrowser1.Navigate("http://hanhtranglaptrinh.com/login.aspx");  
  3. int timeOut = 5;  
  4. DateTime start = DateTime.Now;  
  5. DateTime now = DateTime.Now;  
  6. // đợi load xong trang  
  7. while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)  
  8. {  
  9.     Application.DoEvents();  
  10.     now = DateTime.Now;  
  11.     if ((now - start).TotalMinutes >= timeOut)  
  12.     {  
  13.         // làm cái gì đó  
  14.         throw new Exception("time out");  
  15.     }  
  16. }  
  17. // điền username  
  18. SetText("txtUserName", webBrowser1, "admin");  
  19. // điền pass  
  20. SetText("txtPassword",webBrowser1,"123");  
  21. // nhấn nút đăng nhập  
  22. InvokeClick("btnLogin", webBrowser1);  
Trường hợp trên là đối với các thẻ html có attribute id nên ta sẽ dễ dàng tìm ra đúng thẻ để điền dữ liệu và click vì attribute id là duy nhất. Đối với trường hợp các thẻ html không có attribute id có thể sử dụng các attribute khác như: name, class ... Tuy nhiên các attribute có thể không duy nhất nên sẽ tìm không đúng thẻ html để điền dữ liệu hay click. Ở bài sau mình sẽ hướng dẫn tìm ra thẻ html với các attribute khác.