Thứ Ba, 31 tháng 7, 2012

Sử dụng LINQ để truy vấn dữ liệu trong 1 DataTable

Trước hết phải add reference System.Data.DataSetExtensions.dll để sử dụng phương thức extension AsEnumerable() cho DataTable.

Demo:
  1. // tạo 1 datatable để test  
  2. DataTable table = new DataTable("table");  
  3. table.Columns.Add(new DataColumn("Name"typeof(string)));  
  4. table.Columns.Add(new DataColumn("Age"typeof(int)));  
  5. for (int i = 0; i < 5; i++)  
  6. {  
  7.     DataRow NewRow = table.NewRow();  
  8.     NewRow["Name"] = "Nguyễn Văn " + i;  
  9.     NewRow["Age"] = i;  
  10.     table.Rows.Add(NewRow);  
  11. }  
  12.   
  13. // lấy danh sách những người có tuổi >= 3  
  14. var query = from row in table.AsEnumerable() where row.Field<int>("Age") >=3 select row;  
  15. DataTable dt = query.CopyToDataTable();  
DataTable gốc:


DataTable từ câu truy vấn:


Thứ Hai, 30 tháng 7, 2012

Cấu hình thông báo lỗi 404 not found cho website trong web.config

Thông báo lỗi 404 not found khi người dùng truy cập vào 1 đường dẫn không tồn tại trong website. Việc cài đặt cấu hình sẽ giúp chuyển hướng người dùng đến trang thông báo hoặc chuyển về trang mặc định nào đó khi xảy ra lỗi thay vì hiển thị thông điệp khó hiểu của hệ thống.

Cấu hình trong <system.web>    </system.web>:
  1. <customErrors mode="On" defaultRedirect="~/trang-chu.aspx">  
  2.   <error statusCode="404" redirect="~/thong-bao.aspx"/>  
  3. </customErrors>  
Trong trường hợp đường dẫn không tồn tại (statusCode = 404) trình duyệt sẽ được chuyển tới trang thong-bao.aspx để thông báo hoặc hướng dẫn cho người dùng.

Các trường hợp lỗi khác (statusCode khác) nếu xảy ra nhưng không được cấu hình riêng thì được chuyển về trang mặc định defaultRedirect.

Danh sách mã lỗi( statusCode ) có thể xem tại http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

Note:
Cấu hình thông báo lỗi có thể gây khó khăn cho việc test trong quá trình xây dựng website.
Có 3 mode là On, Off và RemoteOnly. Để test thử cấu hình của bạn thì để mode là On, sau đó nên để mode là RemoteOnly, lúc này khi chạy ứng dụng ở local bạn vẫn  sẽ nhận được thông báo lỗi của hệ thống nếu có lỗi xảy ra.

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

Restore database vào một vị trí mới và đặt lại tên cho database

Đôi khi ta chuyển database từ server cũ qua server mới. Khi tạo lại database bằng cách restore từ 1 bản backup thường báo lỗi không tìm thấy thư mục chứa database. Lúc này ta phải tạo sẵn một thư mục có đường dẫn giống với đường dẫn của thư mục chứa database bên server cũ.
Nếu ta muốn đặt database ở một thư mục khác thì thay vì sử dụng câu lệnh restore thông thường, sử dụng đoạn lệnh mẫu sau để chỉ định thư mục chứa database sau khi restore:
  1. USE master  
  2. GO  
  3. -- First determine the number and names of the files in the backup.  
  4. -- AdventureWorks2008R2_Backup is the name of the backup device.  
  5. RESTORE FILELISTONLY  
  6.    FROM AdventureWorks2008R2_Backup  
  7. -- Restore the files for MyAdvWorks.  
  8. RESTORE DATABASE MyAdvWorks -- có thể đổi tên mới ở chỗ này  
  9.    FROM AdventureWorks2008R2_Backup  
  10.    WITH RECOVERY,  
  11.    MOVE 'AdventureWorks2008R2_Data' TO 'D:\MyData\MyAdvWorks_Data.mdf',   
  12.    MOVE 'AdventureWorks2008R2_Log' TO 'F:\MyLog\MyAdvWorks_Log.ldf'  
  13. GO  
  14.       
Xem hướng dẫn chi tiết trên MSDN

Sử dụng Clipboard bằng javascript

Để đưa 1 giá trị text vào clipboard:
  1. window.clipboardData.setData('Text','aaaaaaaa');  
  2.       
Để lấy giá trị text đang lưu trong clipboard:
  1. var value = window.clipboardData.getData("Text");  
  2.       
Tuy nhiên để các hàm này hoạt động thì trình duyệt người dùng phải cho phép sử dụng clipboard. Hiện giờ đa số các trình duyệt đã disable tính năng này vì lý do an ninh hay 1 vài vấn đề khác:

Problems caused by unintended clipboard access

There are several types of problems which can happen if a website is able to use your system's clipboard through javascript:
  • A website may erase the clipboard data, which may cause you to lose important data that you had copied previously into the clipboard.
  • A website may change the clipboard data, which may cause different data to be pasted later on instead of the data you intended to paste originally.
  • A website may read the clipboard data, and use them in malicious ways or send them to a third party without your knowledge.
Therefore, you should only permit the websites that you absolutely trust to be able to access the clipboard.

Thứ Bảy, 28 tháng 7, 2012

Sử dụng Clipboard trong .NET

.NET cung cấp class Clipboard gồm các phương thức tĩnh để thao tác với Clipboard.

Ví dụ: Để đưa 1 đoạn text vào clipboard sử dụng:
  1. Clipboard.SetText("hanhtranglaptrinh.com");  
Kiểm tra bằng cách kiếm cái ô text nào đó Ctrl + V hoặc click phải chuột chọn paste sẽ thấy kết quả.

Để lấy 1 đoạn text đang được lưu trong clipboard ra sử dụng:
  1. string text = Clipboard.GetText();  
Kiểm tra bằng cách kiếm 1 đoạn văn bản nào đó bôi đen -> chuột phải chọn copy hoặc Ctrl + C sau đó chạy đoạn code trên và kiếm tra biến text.

Đối với ứng dụng windows (windows form, WPF, ... ) thì ngoài text ra còn có thể đưa một số object khác (Image, Stream, ...)  vào Clipboard. Ứng dụng silverlight chỉ hỗ trợ text.

Gửi Email bằng MS SQL Server

Sử dụng đoạn script sau để gửi email trong SQL Server:
  1. EXEC msdb.dbo.sp_send_dbmail  
  2. @profile_name ='Tên của cấu hình đã cài đặt để gửi mail',  
  3. @recipients=N'email người nhận',  
  4. @body=N'Nội dung email',  
  5. @subject = 'subject',  
  6. @body_format = 'HTML'  
  7.       
Note: Trước khi gửi email bạn phải cấu hình email trong SQL Server thì mới có thể gửi được email.

Thứ Sáu, 27 tháng 7, 2012

Dấu hỏi ? ngay sau kiểu dữ liệu có ý nghĩa gì trong C#

Đối với các kiểu dữ liệu không có giá trị null.
Ví dụ kiểu bool thì chỉ có 2 giá trị là true và false, kiểu int thì là những con số, ...
Khi bạn khai báo như sau sẽ bị báo lỗi:
  1. int a = null;  
  2. bool b = null;  
Hoặc:
  1. public int GetNull()  
  2. {  
  3.     return null;  
  4. }  
Hoặc khai báo hàm như sau:
  1. public static void XuLy(int a, int b)  
  2. { }  
Nhưng lúc truyền biến vào hàm là giá trị null:
  1. XuLy(1, null);  
Sử dụng dấu hỏi ? ngay sau kiểu dữ liệu ta được 1 kiểu dữ liệu mới. Miền giá trị bao gồm miền giá trị của kiểu dữ liệu cũ và thêm giá trị null nữa.
Khai báo như sau sẽ không còn báo lỗi nữa:
  1. int? a = null;  
  2. bool? b = null;  
  1. public int? GetNull()  
  2. {  
  3.     return null;  
  4. }  
  1. public static void XuLy(int a, int? b)  
  2. { }  
Note:
 - Chỉ có thể gán kiểu dữ liệu not null cho kiểu dữ liệu có thể null chứ ngược lại thì không.
 - Ví dụ có thể gán:
  1. int a = 5;  
  2. int? b = a;  
Chứ không thể gán:
  1. int? a = 5;  
  2. int b = a;  
Hoặc không thể:
  1. public int Test()  
  2. {  
  3.     return GetNull();  
  4. }  
  5. public int? GetNull()  
  6. {  
  7.     return null;  
  8. }