Ads

Ads
zzzz
Showing posts with label C#_ASP. Show all posts
Showing posts with label C#_ASP. Show all posts

Thursday, November 20, 2014

Tạo báo cáo với Crystal Report dùng store procedure với parameter C# VS 2010

20Me Reviews     10:40 AM    
Bài này hướng dẫn các bạn tạo báo cáo các hóa đơn bán hàng từ ngày, đến ngày với crystal report, truy vấn dữ liệu qua store procedure có nhiều parameter: từ ngày, đến ngày, cơ sở dữ liệu sql server 2008 .

 1. Slide hướng dẫn/ contractor slide
Tạo Crystal Report dùng Store Procedure
2. Source code: download

Thursday, May 22, 2014

Hướng Dẫn Lập Trình Visual C

20Me Reviews     2:10 PM    
Download Here

Cơ bản về regular expression trong C#

20Me Reviews     10:10 AM    

1. Giới thiệu:
RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự.
Chẳng hạn, ta có chuỗi sau:
Mot, Hai, Ba, Bon, NEVERLAND.
Bạn có thể trả về bất cứ hoặc tất cả các chuỗi con của nó (Hai hoặc Bon chẳng hạn) hoặc thay đổi phiên bản của những chuỗi con của nó (Mot hoặc BoN chẳng hạn).

Một RE là một kiểu mẫu văn bản gồm 2 phần: literal (trực kiện) và metacharacters (ký tự siêu).

  • Một literal đơn thuần chỉ là một ký tự (a-z) mà bạn muốn đem so khớp với chuỗi đích.
  • Metacharacters là một ký tự đặc biệt hoạt động như là 1 mệnh lệnh đối với bộ phận phân tích ngữ nghĩa (parser) của RE

Bây giờ chúng ta thử tạo một regular expression như sau:

Code:
^(From|To|Subject|Date):



RE này sẽ khớp với bất cứ chuỗi con nào miễn là chuỗi này là một hàng mới bắt đầu với “From” hoặc “To” hoặc các chữ “Subject” hoặc “Date” (Dấu ^ nghĩa là bắt đầu 1 hàng mới) chuỗi này kết thúc bởi dấu hai chấm (:).

Dấu ^ cho bộ parser của RE biết chuỗi mà ban đang truy tìm phải bắt đầu bởi một hàng mới. Các chữ “From”, “To”,.. là những literal, và những metacharacter “(“, “)”, và “|” được dùng để tạo nhóm literal và cho biết bất cứ những lựa chọn nào cũng phải khớp. Dấu ^ cũng là metacharacter, nó cho biết là khởi đầu 1 hàng. Do đó, bạn đọc hàng sau đây:

Code:
^(From|To|Subject|Date):
Như sau: “cho khớp bất cứ chuỗi con nào bắt đầu bởi một hàng mới theo sau bởi bất cứ 4 chuỗi literal: From,To,Subject và Date rồi theo sau bởi dấu hai chấm

2. Các ký tự siêu thường dùng (vô cùng quan trọng cần phải nắm)

. : đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n.
\d : ký tự chữ số tương đương [0-9]
\D : ký tự ko phải chữ số
\s : ký tự khoảng trắng tương đương [ \f\n\r\t\v]
\S : ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v]
\w : ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9]
\W : ký tự không phải ký tự word tương đương [^a-zA-Z_0-9]
^ : bắt đầu 1 chuỗi hay 1 dòng
$ : kết thúc 1 chuỗi hay 1 dòng
\A : bắt đầu 1 chuỗi
\z : kết thúc 1 chuỗi
| : ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện)
[abc] : khớp với 1 ký tự nằm trong nhóm là a hay b hay c.
[a-z] so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách.
[^abc] sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c.
() : Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc.
? : khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB.
* : khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB
+ : khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB.
{n} : n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A.
{n, } : khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ...
{m,n} : khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA.

Lấy địa chỉ IP trong lập trình C#,VB.NET,ASP.NET,C,C++,Dephi,VB,JAVA,ASP

20Me Reviews     10:08 AM    
Đối với các lập trình viên ít nhất một lần cũng phải có nhu cầu lấy địa chỉ IP (Internet Protocol) cho việc phát triển ứng dụng. Ví dụ để phục vụ cho việc ghi log truy cập, chống đăng nhập nhiều tài khoản cùng một IP, chặn truy cập thông qua IP,… Thông qua những đoạn mã tổng hợp dưới đây, tôi hy vọng nó sẽ hữu ích trong việc tra cứu của các bạn khi cần. Một số ngôn ngữ như là C#, Delphi, VB.NET, VB, C, Java, ASP.NET, PHP, ASP.



using System;
using System.Net;
 
namespace GetIPCS
{
 ///
 /// Gets IP addresses of the local machine
 ///
 class classGetIPCS
 {
  ///
  /// Gets IP addresses of the local machine
  ///
  [STAThread]
  static void Main(string[] args)
  {
   // Get host name
   String strHostName Dns.GetHostName();
   Console.WriteLine("Host Name: " strHostName);
 
   // Find host by name
   IPHostEntry iphostentry Dns.GetHostByName(strHostName);
 
   // Enumerate IP addresses
   int nIP 0;
   foreach(IPAddress ipaddress in iphostentry.AddressList)
   {
    Console.WriteLine("IP #" + ++nIP ": " +
                      ipaddress.ToString());
   }
  }
 }
}
 
2. Delphi

Code:
uses  Winsock;
 
function getIPs: Tstrings;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := TstringList.Create;
  Result.Clear;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I    := 0;
  while pPtr^[I] <> nil do
  begin
    Result.Add(inet_ntoa(pptr^[I]^));
    Inc(I);
  end;
  WSACleanup;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetIps.text);
end;
 











3. VB.NET

Code:
Private Sub IPAddress()
'To get local address
    Dim LocalHostName As String
    Dim i As Integer
    LocalHostName = Dns.GetHostName()
    Dim ipEnter As IPHostEntry = Dns.GetHostByName(LocalHostName)
    Dim IpAdd() As IPAddress = ipEnter.AddressList
    For i = 0 To IpAdd.GetUpperBound(0)
    Next
End Sub
4. C
// Borland C++ 5.0: bcc32.cpp getlocalip.cpp
// Visual C++ 5.0: cl getlocalip.cpp wsock32.lib
//
// This sample program is hereby placed in the public domain.
 
#include
#include 
 
int doit(int, char **)
{
    char ac[80];
    if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
        cerr < < "Error " << WSAGetLastError() <<
                " when getting local host name." << endl;
        return 1;
    }
    cout << "Host name is " << ac << "." << endl;
 
    struct hostent *phe = gethostbyname(ac);
    if (phe == 0) {
        cerr << "Yow! Bad host lookup." << endl;         return 1;     }     for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
        struct in_addr addr;
        memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
        cout < < "Address " << i << ": " << inet_ntoa(addr) << endl;
    }
 
    return 0;
}
 
int main(int argc, char *argv[])
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        return 255;
    }
 
    int retval = doit(argc, argv);
 
    WSACleanup();
 
    return retval;
}
}













 5. Java
 
import java.net.*;
import java.io.*;
 
public class GetIPAddress
{
    public static void main(String [] args)
    {
        try
        {
            InetAddress thisIp =InetAddress.getLocalHost();
            System.out.println("IP:"+thisIp.getHostAddress());
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

6. ASP
string ip;
ip=Request.ServerVariables("HTTP_X_FORWARDED_FOR");
if(ip==string.Empty)
{
ip=Request.ServerVariables("REMOTE_ADDR");
}
8. PHP

PHP Code:
$ip=$_SERVER['REMOTE_ADDR']; 
9. ASP
Code:
<% Response.Write Request.ServerVariables("REMOTE_ADDR") %>
Thật đơn giản để sử dụng đúng không nào , Chúc vui !

Delegates và Events trong C#

20Me Reviews     9:58 AM    
Có một thực tế đang xảy ra đó là nhiều người rất hay nhầm lẫn giữa hai khái niệm Delegate và Event, đặc biệt là đối với những người mới làm quen với ngôn ngữ C# nói riêng và các ngôn ngữ khác thuộc nền tảng .NET nói chung; Và ngay cả đối với những lập trình viên đã có thâm niên thì cũng không phải dễ dàng gì có thể phân biệt được rạch ròi sự khác nhau giữa hai khái niệm này. Bài viết này sẽ đưa ra một số phân tích, so sánh, qua đó mong muốn có thể làm rõ hơn bản chất của hai khái niệm Delegate và Event, và giúp chúng ta thấy rõ hơn được sự khác nhau cũng như mối quan hệ giữa chúng.

1. Delegate

Theo như định nghĩa được đưa ra trên MSDN thì delegate là một kiểu chứa tham chiếu đến một hoặc nhiều phương thức (method), có thể là phương thức của lớp (class’s method) hoặc là phương thức của đối tượng (object’s method). Đối với những ai đã làm việc với ngôn ngữ C hoặc C++ thì có thể thấy delegate gần giống với khái niệm Con trỏ hàm (funtion’s pointer). Tuy nhiên, hiện nay trong nhiều tài liệu vẫn hay dùng chung từ delegate để chỉ đến hai khái niệm khác nhau, gây ra sự mập mờ, đó là Kiểu delegate(delegate type) và Thực thể delegate (delegate instance, hay còn có thể gọi là Đối tượng delegate); Do đó, trong bài viết này chúng ta sẽ không sử dụng từ delegate với nghĩa chung như vậy mà sẽ phân biệt rạch ròi giữa kiểu delegate và đối tượng delegate.
Một kiểu delegate được khai báo bằng cách sử dụng từ khóa delegate đi kèm theo với kiểu dữ liệu trả về, tên và danh sách tham số của nó. Để một delegate có thể chứa tham chiếu đến một phương thức khác (hoặc đôi khi ta có thể nói là: delegate đại diện cho một phương thức) thì cả delegate và phương thức mà nó tham chiếu đến phải có cùng nguyên mẫu (signature), có nghĩa là cả hai đều phải có chung kiểu dữ liệu trả về và danh sách tham số.
Ta sẽ xét một ví dụ mà ở đó có một delegate với tên là Calculation được khai báo, kiểu delegate này có kiểu dữ liệu trả về là int, nhận vào hai tham số thuộc kiểu int; Một đối tương của delegate Calculation được tạo ra và tham chiếu đến phương thức Add() của lớpProgram, chúng ta có thể để ý rằng cả kiểu delegate Calculation và phương thức Add() có kiểu dữ liệu trả về và danh sách tham số giống nhau.
namespace Test
{
    public delegate int Calculation(int a, int b);
    class Program
    {
        static int Add(int a, int b){
            return a + b;
        }
        static void Main(string[] args)
        {
            Calculation ca = new Calculation(Add);
            int c = ca(5, 4);
            Console.WriteLine(“c = {0}”, c);
            Console.ReadLine();
        }
    }
}
 Một cách dùng khác của delegate đó là kỹ thuật sử dụng delegate để truyền một phương thức vào như là tham số của một phương thức khác, ta cùng xem ví dụ sau:
using System; namespace Test {
public delegate int Calculation(int a, int b); class Program {
static int Add(int a, int b) {
return a + b;
} static int Sub(int a, int b) {
return a – b;
}
static int Calculate(int a, int b, Calculation cal) {
return cal(a, b);
} static void Main(string[] args) {
int c = Calculate(5, 4, Add); Console.WriteLine(“c = {0}”, c); int d = Calculate(5, 4, Sub); Console.WriteLine(“d = {0}”, d); Console.ReadLine();
}
}
}
Ở ví dụ trên thì ta đã tạo ra một phương thức Calculate() có hai tham số kiểu int và một tham số thuộc kiểu delegate Calculation, với cách làm này thì sau này, khi đem ra sử dụng hàm Calculate() thì ta hoàn toàn có thể tự do truyền vào bất cứ hàm nào để thực hiện tính toán, miễn sao hàm đó phải có cùng nguyên mẫu với kiểu delegate Calculation. Cách làm này còn được sử dụng để triển khai kỹ thuật callback, để tránh làm cho bài viết quá dài thì những ai quan tâm tới vấn đề này, xin vui lòng tìm hiểu thêm ở đây và ở đây.

2. Event

Điều đầu tiên mà chúng ta cần khẳng định đó là: Event không phải là đối tượng delegate. Để giúp chúng ta có thể thấy rõ được bản chất của  event cũng như sự khác nhau giữa event và delegate thì chúng ta sẽ mượn hai khái niệm khác cũng được sử dụng rất phổ biến trong ngôn ngữ C# đó là Field và Property. Nhìn từ bên ngoài thì Property có vẻ rất giống với Field nhưng bản chất thì Property không phải là Field; Field là một biến, nó chứa dữ liệu, còn Property là một khối lệnh, nó giống với Method hơn. Trong một Property thì ta có hai khối lệnh có thể được khai báo đó là get và set còn Field thì chỉ được khai báo trên một dòng. Thông thường thì người ta sử dụng các Property như là cách để truy xuất đến các Field của lớp đó, như trong ví dụ sau:
class Customer {
private string name;
public string Name {
get {
return this.name;
} set{
this.name = value;
}
}
}
Nhưng đôi lúc ta cũng có thể tạo ra các Property mà không dính dáng gì đến Field cả:
class TimeUtil {
public DateTime CurrentTime{
get {
return DateTime.Now;
}
}
}
 Và với sự cải tiến không ngừng của C# nói riêng và .NET nói chung thì bây giờ ta có thể khai báo Property với dạng như sau:
class Customer {
public string Name {
get;
set;
}
}
Nhìn khối lệnh trên thì thật đơn giản phải không, và hình như là không có bất cứ một Field nào được khai báo trong đó cả, nhưng thực tế thì nó lại khác. Trình biên dịch sẽ tự động tạo ra một field có kiểu string rồi sau đó sử dụng nó để triển khai property Name, và như vậy, đoạn code ở trên thực ra chỉ là một phiên bản rút gọn của lớp Customer mà chúng ta đã xem xét trước đó. Bây giờ thì chúng ta đã nắm rõ ràng hơn về bản chất của Field và Property, chúng ta quay lại trường hợp của Delegate và Event, có thể nói rằng mối liên quan giữa Delegate và Event không khác với mối liên quan giữa Field và Property là mấy. Thông thường, để xây dựng một Event thì ta thực hiện như ví dụ sau:
public delegate void ErrorNotification(string message);
class MyMachine{
public event ErrorNotification Notify;
public void ReportError(string error) {
if (Notify != null)
Notify(error);
}
}
và sử dụng:
static void Main(string[] args) {
MyMachine machine = new MyMachine();
machine.Notify += new ErrorNotification(PrintString);
machine.ReportError(“Some bug ocurred”);
Console.ReadLine();
}
static void PrintString(string msg){
Console.WriteLine(msg);
}
Ở ví dụ trên thì ta đã khai báo một kiểu delegate có tên là ErrorNotification, sau đó sử dụng nó để tạo một event cho lớp MyMachine với tên là Notify. Nhìn vào đoạn code đó thì sẽ có nhiều người cho rằng event được tạo ra bằng cách tạo một đối tượng mới của kiểu delegate ErrorNotification, nhưng thực tế thì không hề đơn giản như vậy. Một Event thực chất là một khối lệnh, tương tự như Property, nó cũng có hai khối lệnh con được khai báo trong đó là add và remove; khối lệnh add được dùng để đăng ký một phương thức với event, còn khối lệnh remove được dùng để gỡ bỏ một phương thức ra khỏi event đó. Đây chính là cách khai báo một event ngắn gọn, và dễ gây ra nhầm lẫn, ta thử viết lại đoạn code của lớp MyMachineở dạng nguyên thủy của nó:
class MyMachine{
private ErrorNotification notify;//Delegate instance
//Event declaration
public event ErrorNotification Notify{
add{
this.notify += value;
}
remove{
this.notify -= value;
}
}
public void ReportError(string error) {
if (notify != null)
notify(error);
}
}
và đem ra sử dụng:
static void Main(string[] args) {
MyMachine machine = new MyMachine();
machine.Notify += new ErrorNotification(PrintString);
machine.ReportError(“Some bug ocurred”);
Console.ReadLine();
}
static void PrintString(string msg){
Console.WriteLine(msg);
}
Hãy chú ý đến cái cách mà chúng ta đã khai báo event Notify của lớp MyMachine với hai khối lệnh add và remove bên trong. Và với cách triển khai cụ thể như vậy, ta có thể dễ dàng thấy rằng Event thực chất là cái cách mà chúng ta sử dụng để truy xuất đến một private delegate ở bên trong một lớp; Ở đây thì value có kiểu là ErrorNotification . Bây giờ thì bạn đã tin cái câu khẳng định trước đó chưa? Event không phải là đối tượng delegate. Và chắc bạn cũng đã thông cảm được với việc tại sao chúng ta lại dựa vào Field và Property để có dẫn dắt vào vấn đề tương quan giữa Delegate và Event, bởi vì thực sự nó có sự tương đồng nhau mà. Tóm lại thì cách khai báo event có dạng:
public event EventHandler MyEvent
chỉ là một cách viết ngắn gọn, và nó còn có tên gọi là field-like event.

3. Mấu chốt của vấn đề

Tại sao lại cần thiết phải có cả hai khái niệm là delegate và event? Câu trả lời ở đây chính là Encapsulation (tính bao gói).
Đâu là cách để đăng ký một event cho một đối tượng nào đó? Có ba sự lựa chọn:
- Một là, tạo một đối tượng delegate với mức truy cập là public, cách này thì chắc chắn là bị loại đầu tiên, vì nó không đảm bảo được sự đóng gói của đối tượng.
- Cách thứ 2, tạo một đối tượng delegate có mức truy cập là private và đồng thời tạo ra một property để truy xuất đến đối tượng delegate đó; cách này thì khá hơn cách trước, nhưng nhược điểm của nó là ta có thể sẽ có khó khăn khi muốn đăng ký nhiều phương thức với sự kiện này, bởi vì nó chỉ có thể nhận vào một phương thức mà thôi, ví dụ: someInstance.MyEvent = eventHandler, như vậy thì nó sẽ xóa mất phương thức mà trước đó MyEvent đã tham chiếu đến, chú ý đến toán tử “=” chứ không phải là  ”+=” (Propety thì không thể dùng với toán tử +=).
- Cách thứ 3, và cũng là cách mà ta đang sử dụng, đó là tạo một đối tượng delegate rồi sau đó tạo hai khối lệnh dùng để add và remove các đối tượng delegate. Với cách thứ 3 thì ta đã bảo đảm được tính bao gói một cách toàn diện. Và cách thứ 3 khi được viết ngắn gọn thì chính là cái cách mà chúng ta vẫn thường dùng, kể từ khi bắt đầu làm quen với events.

4. Một vài sự khác nhau về cách sử dụng của Delegate và Event

Event có thể được khai báo trong interface, Delegate thì không.
Event chỉ có thể được gọi (invoked) ở bên trong class chứa nó, Delegate thì có thể được gọi ở bất cứ đâu (Tùy thuộc vào access modifier).

5. Kết luận

Delegate cung cấp cho ta một cách đơn giản để có thể đại diện cho các lời gọi của phương thức, đặc biệt là các phương thức của đối tượng. Delegate được sử dụng để triển khai các event.
Trong khi đó, event là cách để một lớp có thể đưa ra các thông báo (notification) đến các lớp khác khi có một sự kiện nào đó xảy ra với bản thân nó. Lớp tung ra event được gọi là publisher, còn lớp nhận và xử lý các event này được gọi là Subcriber.
Event và Delegate là một cách mà C# sử dụng để triển khai cơ chế Observer Pattern (cũng còn được gọi là mô hình Publisher/Subcriber), điều mà trong Java thì được thực hiện bởi  các ActionListener.
Nguồn: http://tapchilaptrinh.wordpress.com

© 2014-2015 Ebook-Coding Share and Learning | Distributed By My Blogger Themes | Designed By Ebook-coding