Thứ Năm, 26 tháng 7, 2012

Cách sử dụng ( đọc, thêm, sửa, xóa ) appSettings trong file app.config C#

Hiện giờ thường chỉ những file cấu hình đặc biệt người ta mới sử dụng file xml để cấu hình cho ứng dụng. Với những cấu hình không quá phức tạp thì việc sử dụng appSettings trong file app.config cực kỳ nhanh gọn.

Khai báo biến 'abc' có giá trị '01/01/1900 00:00:00 AM' trong appSettings  trong file app.config:
  1. <?xml version="1.0"?>  
  2. <configuration>  
  3. <startup>  
  4.   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>  
  5.   <appSettings>  
  6.     <add key="abc" value="01/01/1900 00:00:00 AM"/>  
  7.   </appSettings>  
  8. </configuration>  
  9.       
Để đọc giá trị của abc sử dụng:
  1. string abc = ConfigurationManager.AppSettings["abc"];  
  2.       
Khi cần thay đổi các giá trị cấu hình này, cách đơn giản nhất là mở file config lên và sửa ^^!. Tuy nhiên đối với những ứng dụng cho người dùng cuối, không thể bắt người dùng tự vào chỉnh sửa được mà ta phải làm chức năng cho họ cấu hình. Dưới đây là một số hàm cần thiết để chỉnh sửa file config.

- Sửa giá trị của biến trong appSettings trong file app.config:
  1. public static void EditAppSetting(string key, string value)  
  2. {  
  3.     System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
  4.     config.AppSettings.Settings[key].Value = value;  
  5.     config.Save(ConfigurationSaveMode.Modified);  
  6.     ConfigurationManager.RefreshSection("appSettings");  
  7. }  
- Thêm 1 giá trị mới vào appSettings trong file app.config:
  1. public static void AddAppSetting(string key, string value)  
  2. {  
  3.     System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
  4.     config.AppSettings.Settings.Add(key,value);  
  5.     config.Save(ConfigurationSaveMode.Modified);  
  6.     ConfigurationManager.RefreshSection("appSettings");  
  7. }  
- Xóa 1 giá trị ra khỏi appSettings trong file app.config:
  1. public static void RemoveAppSetting(string key)  
  2. {  
  3.     System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
  4.     config.AppSettings.Settings.Remove(key);  
  5.     config.Save(ConfigurationSaveMode.Modified);  
  6.     ConfigurationManager.RefreshSection("appSettings");  
  7. }  
Demo thử hàm edit nào:
  1. Console.WriteLine(ConfigurationManager.AppSettings["abc"]);  
  2. EditAppSetting("abc",DateTime.Now.ToString());  
  3. Console.WriteLine(ConfigurationManager.AppSettings["abc"]);  
  4. Console.ReadLine();  
Dòng đầu tiên sẽ in ra giá trị của abc trước khi sửa file config.
Dòng thứ 2 tiến hành sửa giá trị abc thành giá trị thời gian hiện tại trong file config.
Dòng thứ 3 tiến hành đọc lại và in ra giá trị của abc sau khi đã sửa file config.
Chạy lại thêm một lần nữa :
Vậy là xong. Sử dụng app.config nhanh hơn so với thao tác đọc và ghi file xml nhiều đúng không nào.

Note:
- Cần add Reference System.configuration.
- Sau khi chạy chương trình thì file config bị chỉnh sửa là file config trong cùng thư mục chứa file exe (có dạng TenUngDung.exe.config) chứ không phải file app.config trong project đâu nhé.
- Quá trình sửa file config chỉ chính xác khi build ứng dụng ra thành file exe và chạy. Nếu chạy trong chế độ debug thì bị tình trạng là đọc từ file TenUngDung.exe.config nhưng lại ghi ra file TenUngDung.vshost.exe.config.

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

Sử dụng DataView để filter dữ liệu từ DataTable C#

Khi chúng ta được cung cấp 1 DataTable chứa dữ liệu nhưng chỉ cần lấy ra 1 số dòng thỏa điều kiện nào đó thôi. Cách truyền thống vấn là duyệt từng dòng rồi so sánh giá trị nếu phù hợp thì lấy, không phù hợp thì bỏ qua.
Sử dụng DataView để lấy dữ liệu theo điều kiện nào đó 1 cách nhanh chóng.

Demo:
Tạo 1 DataTable chứa thông tin tên và tuổi của một số người:
  1. DataTable table = new DataTable("table");  
  2. table.Columns.Add(new DataColumn("Name"typeof(string)));  
  3. table.Columns.Add(new DataColumn("Age"typeof(int)));  
  4. for (int i = 0; i < 5; i++)  
  5. {  
  6.     DataRow NewRow = table.NewRow();  
  7.     NewRow["Name"] = "Nguyễn Văn " + i;  
  8.     NewRow["Age"] = i;  
  9.     table.Rows.Add(NewRow);  
  10. }  
Bây giờ nếu chỉ muốn lấy những người có tuổi lớn hơn 2:
  1. // new 1 DataView  
  2. DataView dataView = new DataView(table);  
  3.   
  4. // chỉ lấy những người có tuổi lớn hơn 2  
  5. dataView.RowFilter = "Age > 2";  
Vậy là Ok, lúc này DataView chỉ chứa những dòng có giá trị thỏa điều kiện filter. Có thể dùng DataView này để đưa vào DataGridView.

Sử dụng 2 hàm sau để test kết quả:
  1. private static void PrintTable(DataTable table)  
  2. {  
  3.     for (int i = 0; i < table.Rows.Count; i++)  
  4.     {  
  5.         Console.WriteLine("\t" + table.Rows[i]["Name"] +": "+ table.Rows[i]["Age"] + " tuổi.");  
  6.     }  
  7.     Console.WriteLine();  
  8. }  
  9.   
  10. private static void PrintView(DataView view)  
  11. {  
  12.     for (int i = 0; i < view.Count; i++)  
  13.     {  
  14.         Console.WriteLine("\t" + view[i]["Name"] + ": " + view[i]["Age"] + " tuổi.");  
  15.     }  
  16.     Console.WriteLine();  
  17. }  
Thực hiện test:
  1. DataTable table = new DataTable("table");  
  2. table.Columns.Add(new DataColumn("Name"typeof(string)));  
  3. table.Columns.Add(new DataColumn("Age"typeof(int)));  
  4. for (int i = 0; i < 5; i++)  
  5. {  
  6.     DataRow NewRow = table.NewRow();  
  7.     NewRow["Name"] = "Nguyễn Văn " + i;  
  8.     NewRow["Age"] = i;  
  9.     table.Rows.Add(NewRow);  
  10. }  
  11.   
  12. // new 1 DataView  
  13. DataView dataView = new DataView(table);  
  14.   
  15. // chỉ lấy những người có tuổi lớn hơn 2  
  16. dataView.RowFilter = "Age > 2";  
  17.   
  18. PrintTable(table);  
  19. PrintView(dataView);  
  20. Console.ReadLine();  
Kết quả sau khi filter chỉ còn Nguyễn Văn 3 và Nguyễn Văn 4:

Thứ Ba, 24 tháng 7, 2012

Kiểm tra địa chỉ Ip V4 hợp lệ

Mình đang làm một chức năng mà người dùng sẽ nhập vào địa chỉ Ip.
Đoạn code đơn giản để kiểm tra xem một chuỗi có phải là địa chỉ Ip v4 hợp lệ hay không:
  1. public static bool IsIpV4Address(string str)  
  2. {  
  3.     string[] arr = str.Split('.');  
  4.     if (arr.Length != 4)  
  5.         return false;  
  6.     foreach (string sub in arr)  
  7.     {  
  8.         try  
  9.         {  
  10.             int test = int.Parse(sub);  
  11.             if (test < 0 || test > 255)  
  12.                 return false;  
  13.   
  14.             //nếu sub có nhiều chữ số 0 ở trước, khi convert qua số sẽ bị mất các số 0 ở đằng trước  
  15.             if (test.ToString().Length != sub.Length)  
  16.             {  
  17.                 // chứng tỏ sub có chứa các số 0 thừa ở đằng trước -> không hợp lệ.  
  18.                 return false;  
  19.             }  
  20.         }  
  21.         catch  
  22.         {  
  23.             return false;  
  24.         }  
  25.     }  
  26.     // vượt qua đc hết đống thử thách này thì chắc chắn là địa chỉ Ip V4 rùi ^^!    
  27.     return true;  
  28. }   

Thứ Hai, 23 tháng 7, 2012

Lấy danh sách tất cả các table, các column trong table và kiểu dữ liệu của column trong database Sql Server

Bài này mình sẽ hướng dẫn cách lấy danh sách tất cả các table, các column trong table và kiểu dữ liệu của column trong database Sql Server:

Lấy danh sách các table:
  1. select object_id,name from sys.objects where type='u'  
  2. -- hoặc  
  3. select object_id,name from sys.tables  
  4.       
Dựa vào object_id của mỗi table ta lấy ra được danh sách các column trong table đó:
  1. select * from sys.all_columns where object_id = [object_id của table]  
  2.       
Sau khi chạy câu truy vấn trên, để ý cột user_type_id nó chính là id của kiểu dữ liệu trong SQL. Truy vấn sys.types để lấy tên kiểu dữ liệu. Ví dụ kiểu bigint:
  1. select * from sys.types where user_type_id = 127  
  2.       
Lúc này ta đã lấy được kiểu dữ liệu của từng column trong table rồi đó.

Demo nào:
Trong database của mình có 1 table tên tblBug. Sau khi truy vấn mình lấy được object_id của nó là 248325189:
  1. select object_id,name from sys.objects where type='u' and name ='tblBug'  
  2.       
Lấy danh sách các column và kiểu dữ liệu:
  1. select cl.name as 'Tên column', tp.name as 'Kiểu dữ liệu',cl.max_length from sys.all_columns cl join sys.types tp on cl.user_type_id = tp.user_type_id where object_id = 248325189  
  2.       
Kết quả:
Lúc này có thể lấy các thông tin trên để generate source code tự động cho việc lập trình rùi.

Xem danh sách các object trong Database SQL Server

Truy vấn thông tin trong sys.objects để xem thông tin các object được tạo trong database. Những thông tin này rất có ích trong việc quản lý database.
  1. select * from sys.objects  
  2.       
Chúng ta có thể filter các object dựa vào type của chúng. Ví dụ bạn muốn lấy danh sách tất cả các table trong database:
  1. -- type='u' tức là table  
  2. select * from sys.objects where type='u'  
  3. -- tương đương với:  
  4. select * from sys.tables  
  5.       
Hoặc danh sách tất cả các stored procedure:
  1. select * from sys.objects where type='p'  
  2. -- tương đương với:  
  3. select * from sys.procedures  
  4.       
Danh sách type của các object tham khảo từ MSDN:
Object type:
AF = Aggregate function (CLR)
C = CHECK constraint
D = DEFAULT (constraint or stand-alone)
F = FOREIGN KEY constraint
FN = SQL scalar function
FS = Assembly (CLR) scalar-function
FT = Assembly (CLR) table-valued function
IF = SQL inline table-valued function
IT = Internal table
P = SQL Stored Procedure
PC = Assembly (CLR) stored-procedure
PG = Plan guide
PK = PRIMARY KEY constraint
R = Rule (old-style, stand-alone)
RF = Replication-filter-procedure
S = System base table
SN = Synonym
SO = Sequence object
SQ = Service queue
TA = Assembly (CLR) DML trigger
TF = SQL table-valued-function
TR = SQL DML trigger
TT = Table type
U = Table (user-defined)
UQ = UNIQUE constraint
V = View
X = Extended stored procedure
Nguồn MSDN

Toán tử ?? trong C#

Toán tử ?? được dùng để định nghĩa giá trị mặc định trả về nếu giá trị của biến là null.

Xem ví dụ sau:
  1. string input = "test@hanhtranglaptrinh.com";  
  2. string test = input;  
  3. test = test.Replace("@","[a còng]");  
  4. // giá trị của test lúc này là: test[a còng]hanhtranglaptrinh.com  
Chuyện gì sẽ xảy ra nếu gán giá trị input bằng null.
  1. string input = null;  
  2. string test = input;  
  3. test = test.Replace("@","[a còng]");  
  4. // sẽ có exception khi gọi phương thức replace vì lúc này biến test cũng bằng null
Sử dụng toán tử ?? để gắn giá trị mặc định cho biến test khi biến input bằng null. Lúc này biến test sẽ được gắn giá trị mặc định nên đoạn code vẫn chạy bình thường.
  1. string input = null;  
  2. string test = input ?? "giá trị mặc định";  
  3. test = test.Replace("@","[a còng]");  
Đoạn code trên tương đương với:
  1. string input = null;  
  2. string test;  
  3. if (input == null)  
  4.     test = "giá trị mặc định";  
  5. else  
  6.     test = input;  
  7. test = test.Replace("@""[a còng]");  
Hoặc tương đương với cách sử dụng toán tử ?: như sau:
  1. string input = null;  
  2. string test = (input == null) ? "giá trị mặc định" : input;  
  3. test = test.Replace("@""[a còng]");  
Xem thêm: Toán tử ?: trong C#

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

Tìm kiếm trong danh sách hoặc mảng sử dụng LINQ query

Biết cách sử dụng LINQ query là một lợi thế lớn trong lập trình .NET, sử dụng nhanh chóng, cách viết câu query khá giống và quen thuộc với cách viết T-SQL.

Tìm kiếm trong danh sách:
  1. List<int> list = new List<int>();  
  2. list.Add(1);  
  3. list.Add(2);  
  4. list.Add(2);  
  5. list.Add(3);  
  6. list.Add(4);  
  7. list.Add(5);  
  8.   
  9. // lấy ra trong danh sách những phần tử >2  
  10. List<int> result = (from item in list where item > 2 select item).ToList();  
  11.   
  12. // lấy giá trị đầu tiên  
  13. int first = (from item in list where item > 2 select item).First();  
Tìm kiếm trong mảng:
  1. int[] arr = new int[] { 1, 2, 2, 3, 4, 5 };  
  2.   
  3. // lấy ra trong danh sách những phần tử >2  
  4. int[] result = (from item in arr where item > 2 select item).ToArray();  
  5.   
  6. // lấy giá trị đầu tiên  
  7. int first = (from item in arr where item > 2 select item).First();  
Một ví dụ sử dụng class:
  1. class Person  
  2. {  
  3.     public string Name { getset; }  
  4.     public int Age { getset; }  
  5.   
  6.     public Person(string name, int age)  
  7.     {  
  8.         Name = name;  
  9.         Age = age;  
  10.     }  
  11. }  
  1. List<Person> list = new List<Person>();  
  2. list.Add(new Person("Nguyễn Văn A",16));  
  3. list.Add(new Person("Nguyễn Văn B", 17));  
  4. list.Add(new Person("Nguyễn Văn C", 18));  
  5.   
  6. // tìm tuổi của Nguyễn Văn A  
  7. int age = (from person in list where person.Name == "Nguyễn Văn A" select person).First().Age;  
Chú ý: toán sử so sánh bằng vẫn là 2 dấu bằng '==' chứ không phải 1 dấu bằng như trong SQL đâu nhé.