LINQ to Sqlite, LINQ to MySQL, LINQ to Oracle
thuvienwinform - SQLite mà mình thấy nó quá tuyệt với rồi! Bây giờ lại phát hiện ra bộ kết nối giữa C# với SQLite bằng LINQ nữa, tốc độ code phải tăng gấp 10 lần mất, không tù tội như hồi trước xài ADO.NET nũa (nói thế hơi quá nhưng ADO.NET phải chạy mới biết lỗi). Nó chính là bộ LinqConnect. Các bạn có thể tải về bản đầy đủ tất cả LINQ to X với X = {SQLite, MySQL, Oracle,...} :D. Việc sử dụng tương tự như LINQ to SQL, cũng kéo thả, sinh code tự động.
Tải về (44MB):
- Dropbox: https://www.dropbox.com/s/bo88kvu7b6s2w8a/linqconnectfree.exe
- MediaFire: http://www.mediafire.com/download/2sjr3jxegugb1t1/linqconnectfree.exe
Trước khi cài thoát Visual Studio ra nha. Sau khi cài xong thì add item nó sẽ có cái này:
Tạo CSDL bằng SQLite: http://thuvienwinform.blogspot.com/2013/10/SQLite-chay-ung-dung-su-dung-da-tabase-tren-may-khong-cai-sql.html
Hướng dẫn: http://www.devart.com/dotconnect/sqlite/articles/tutorial_linq.html#model
Chú ý khi sử dụng
- Nhập đúng namspace. Bình thường cứ quen tay next next là hỏng đấy :D
Còn việc thêm, sửa, xóa thì giống hệt trong LINQ to SQL:
- Nạp, thêm dữ liệu: http://thuvienwinform.blogspot.com/2014/01/linq-to-sql-bai-1-load-va-them-du-lieu.html
- Sửa dữ liệu: http://thuvienwinform.blogspot.com/2014/01/linq-to-sql-bai-2-sua-du-lieu.html
- Xóa dữ liệu: http://thuvienwinform.blogspot.com/2014/01/linq-to-sql-bai-3-xoa-du-lieu.html
Chú ý:
Muốn sang máy khác chạy được cần copy toàn bộ thư viện (các tệp .dll) gồm:
1. Phần tự sinh của Devart
Devart.Data.dll
Devart.Data.Linq.dll
Devart.Data.SQLite.dll
Devart.Data.SQLite.Linq.dll
2. Phần lấy trong ổ cài của Devart: (mặc định: C:\Program Files (x86)\Devart\dotConnect\SQLite)
sqlite3.dll
thư mục x64
Tổng cộng bằng này cái:
Nếu không đủ sẽ gặp một số lỗi về như DbCommand..., version asembly...balabala
CHAT LAN C#. Phần 3: Code máy khách (Client). Gửi, nhận dữ liệu với máy chủ
thuvienwinform - Sau khi đã có máy chủ thì chỉ việc tạo các máy khách kết nối đến máy chủ để giao tiếp với nhau thui. Sau khi tạo được kết nối thì máy khách sẽ gửi dữ liệu đến máy chủ và nhận dữ liệu truyền về! Đơn giản hơn code trên máy chủ rất nhiều.
Tải về project: https://www.dropbox.com/s/3moekk8knkge5s4/thuvienwinform-CHATLANClient.rar (18KB)
Yêu cầu:
- Kết nối chung mạng với máy cái ChatLanServer.
- Máy khách không cần Ip tĩnh
Cụ thể các bước xây dựng một máy khách như sau:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định (là ip tĩnh và cổng được tạo cho chương trình ChatLanServer trên máy chủ)
3/ Thực hiên giao tiếp với máy chủ
4/ Đóng kết nối
Các biến:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định
3/ Thực hiên giao tiếp với máy chủ
- Nhận dữ liệu: TcpClient.GetStream().Read
- Gửi dữ liệu: TcpClient.GetStream().Write
4/ Đóng kết nối
Thêm mô tả tìm kiếm và Liên kết cố định để SEO chuẩn :)
Nếu bạn mua IP tĩnh thì nó trở thành chat online là truyện bình thường :) cho máy cài IP tĩnh đó chạy chương trình server và các máy khách kết nối đến là được
19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Tải về project: https://www.dropbox.com/s/3moekk8knkge5s4/thuvienwinform-CHATLANClient.rar (18KB)
Yêu cầu:
- Kết nối chung mạng với máy cái ChatLanServer.
- Máy khách không cần Ip tĩnh
Cụ thể các bước xây dựng một máy khách như sau:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định (là ip tĩnh và cổng được tạo cho chương trình ChatLanServer trên máy chủ)
3/ Thực hiên giao tiếp với máy chủ
4/ Đóng kết nối
Các biến:
//Địa chỉ mặc định string IP = "127.0.0.1"; int PORT = 100; //Các luồng Thread thKetNoiDenServer, thKetNoiTaoServer; //Biến dùng để gửi, nhận dữ liệu byte[] dlNhan = new byte[1024]; byte[] dlGui = new byte[1024]; TcpClient Khach;
1/ Tạo luồng kết nối TcpClient
Khach = new TcpClient();
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định
Khach.Connect(IPAddress.Parse(IP), PORT);
3/ Thực hiên giao tiếp với máy chủ
- Nhận dữ liệu: TcpClient.GetStream().Read
string tmp = "";
byte[] dlNhan = new byte[1024]; Khach.GetStream().Read(dlNhan, 0, 1024); tmp = Encoding.Unicode.GetString(dlNhan);
- Gửi dữ liệu: TcpClient.GetStream().Write
byte[] dlGui = new byte[1024]; dlGui = Encoding.Unicode.GetBytes(txtGui.Text); Khach.GetStream().Write(dlGui, 0, dlGui.Length);
4/ Đóng kết nối
Thêm mô tả tìm kiếm và Liên kết cố định để SEO chuẩn :)
Khach.Close();
Nếu bạn mua IP tĩnh thì nó trở thành chat online là truyện bình thường :) cho máy cài IP tĩnh đó chạy chương trình server và các máy khách kết nối đến là được
19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
CHAT LAN C#. Phần 2: Code máy chủ (Server). Xử lí việc gửi nhận với nhiều máy khách
thuvienwinform - Để thực xây dựng chương trình gửi tin nhắn qua mạng LAN cần có một chương trình chạy trên máy chủ. Chức năng chính của nó là: Nhận kết nối từ các máy khách, sau khi tạo được kết nối thì bắt đầu việc gửi/nhận dữ liệu giữa máy chủ và máy khách. Khi nhận được dữ liệu (văn bản, hình ảnh, âm thanh,..) thì sẽ được xử lí trên máy chủ này. Có thể là lưu vào CSDL hoặc thực hiện các lệnh nhận được từ máy khách như gửi cho họ một tài liệu, hình ảnh, đoạn phim,...
Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)
Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html
Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket
- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.
- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html
Các biến:
1/ Tạo (mở) một cổng kết nối logic (socket)
Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
với List cacMay = new List();
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:
3/ Thực hiên giao tiếp với máy khách
- Nhận văn bản gửi đến lưu vào biến tạm tmp
- Gửi văn bản đến các máy khách:
Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket
Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)
Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html
Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket
- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.
- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html
Các biến:
//Địa chỉ mặc định string IP = "127.0.0.1"; int PORT = 100; //Các luồng Thread thKetNoiDenServer, thKetNoiTaoServer, thLienLacKhach; TcpListener langNghe; //Biến dùng để gửi, nhận dữ liệu byte[] dlNhan = new byte[1024]; byte[] dlGui = new byte[1024]; //Socket tạo server và kết nối Socket socket; //Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Danh sách các máy khách kết nối đến ListcacMay = new List ();
1/ Tạo (mở) một cổng kết nối logic (socket)
//Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IP), PORT);//IP = "127.0.0.1"; PORT = 100; //Liên kết cổng s với địa chỉ IP và cổng s.Bind(iep); //Nhận tín hiệu từ các máy kết nối s.Listen(10);
Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
//Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket);
với List
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:
//Trong khi còn kết nối. Mỗi khi có tín hiệu từ máy khách đến sẽ thêm vào -> nhận đc nhiều máy khách cùng lúc
while (true) { //Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket); }
3/ Thực hiên giao tiếp với máy khách
- Nhận văn bản gửi đến lưu vào biến tạm tmp
string tmp = "";
byte[] dlNhan = new byte[1024]; socket.Receive(dlNhan); tmp = Encoding.Unicode.GetString(dlNhan);
- Gửi văn bản đến các máy khách:
foreach (Socket s in cacMay) { s.Send(Encoding.Unicode.GetBytes(noiDung)); }
Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket
Khach.Close();
Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
CHAT LAN C#. Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
thuvienwinform - C# hỗ trợ chúng ta lập trình mạng rất tốt, cụ thể là có thư viện System.Net. Qua đó chúng ta có thể xây dựng những ứng dụng hữu ích để gửi, nhận dữ liệu qua mạng. Một ví dụ điển hình cho việc lập trình mạng là chương trình gửi tin nhắn (chat) qua mạng LAN. Cũng đơn giản thui từ từ từng bước một là OK. Để xây dựng chương trình này trước hết chúng ta cần tìm hiểu về giao thức hoạt động để gửi/nhận dữ liệu TCP và System.NET
1. TCP
Wikipedia:
- TCP là giao thức cốt lõi của bộ giao thức TCP/IP. Sử dụng TCP, ử dụng TCP, các ứng dụng trên các máy chủ được nối mạng có thể tạo các "kết nối" với nhau, mà qua đó chúng có thể trao đổi dữ liệu hoặc các gói tin. Giao thức này đảm bảo chuyển giao dữ liệu tới nơi nhận một cách đáng tin cậy và đúng thứ tự. TCP còn phân biệt giữa dữ liệu của nhiều ứng dụng (chẳng hạn, dịch vụ Web và dịch vụ thư điện tử) đồng thời chạy trên cùng một máy chủ. Xem thêm...
- TCP hỗ trợ nhiều giao thức ứng dụng phổ biến trên Internet và các ứng dụng kết quả như www, thư điện tử,...
- TCP như kiểu 2 hay nhiều người nói chuyện với nhau. Một người hỏi: "Mày có nghe rõ không" nếu thằng kia trả lời "Có" thì mới thực hiện trò chuyện. Vì vậy TCP đảm bào việc truyền dữ liệu
- Mỗi máy tính có một địa chỉ IP => phân biệt các máy qua địa chỉ IP. Mỗi chương trình trên máy có một cổng kết nối => phân biết các chương trình bằng cổng kết nối. => để gửi dữ liệu cho một chương trình trên máy tính cần có địa chỉ ip của máy và cổng của chương trình đó
- Ngoài TCP thì trong bộ giao thức TCP/IP còn có thêm giao thức UDP. Cái này nó truyền tín hiệu nhanh hơn TCP nhưng tín hiệu truyền đi lại được cho phép mất, không biết thèn kia có nhận được hay chưa. Bù lại thì nó truyền nhanh hơn. Như trong ví dụ 2 thằng nói truyện ở trên, với UDP thì không cần thằng kí trả lời có ta vẫn cứ nói, mặc kệ có nghe tao hay không :D. Giống như kiểu gửi email cho 1 thằng offline, không biết nó có nhận và đọc hay không
- Tài liệu về giao TCP và IP: https://docs.google.com/document/d/1GR39aiMkP1giKa9Brppbc9loHB2YaQ5QjD0ZX_M2YLo/edit?hl=en
| ||||||||||||||||||||||
- Để xây dựng chương trình chat qua mạng LAN ta cần sử dụng: IPEndPoint, Socket, TcpClient, IPAdress
Ở phần tiếp thuvienwinform sẽ mang đến project dành cho máy chủ trong chương trình chat qua mạng LAN.
19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Thread trong C#
thuvienwinform - Thread cho phép thực hiện cùng lúc nhiều công việc song song với nhau mà không bị đơ, lag (lác :D), gián đoạn. Nó đặc biệt quan trọng trong lập trình mạng, các ứng dụng đỏi hỏi thực hiện công việc nặng nhọc, duyệt vòng lặp lớn (lặp vài trăm nghìn lần như duyệt các thư mục), nếu không dùng thread thì chương trình sẽ không thể tương tác được, có thể rơi vào trạng thái không phản hồi (Not Responding - Cái này quen quen). Nhờ có Thread mà ứng dụng trở nên mượt hơn, hạn chế đơ, lag, sử dụng CPU hiệu quả hơn với lập trình winform.
- Để sử dụng thread ta khai báo using System.Threading;
- Số thread tối đa cho 1 chương trình:
+ Với .NET2.0 là 25.
+ Với .NET3.5 là 250.
+ Với .NET4.0 (32bit) là 1023.
+ Với .NET4.0 (64bit) là 32768.
+...
1/ Tạo thread mới để chạy 1 hàm, thủ tục
- Cho hàm, thủ tục không có tham số truyền vào
Thread t1; t1 = new Thread(ThuTuc1);với ThuTuc1 là một thủ tục (void) không có tham số truyền vào
Các ví dụ dưới đây sẽ dùng thread t1 này là ví dụ ạ
- Cho hàm, thủ tục có tham số truyền vào (Sử dụng Lambda Expresstion)
t1 = new Thread();
t1 = new Thread((ThreadStart) => { ThuTuc2("Truyen vao"); });2/ Chạy thread đó
- Sau khi tọa được thread rùi ta có thể cho nó bắt đầu chạy:
t1.Start();
3/ Dừng thread
t1.Abort();
4/ Tạm dừng thread
t1.Suspend();Tạm dừng cho đến khi
t1.Resume();
5/ Mức độ ưu tiên của thread (Thread Priority)
- Khi sử dụng nhiều thread thì ta cài đặt độ ưu tiên thực thi của các thread
t1.Priority = ThreadPriority.Lowest;- Có các giá mức ưu tiên: Lowest, BelowNormal, Normal, AboveNormal, Hightest
6/ Join
- Cái này nó sẽ làm như sau: Những thread dưới câu lệnh Join() sẽ được start sau khi các thread trên câu lệnh join chạy xong
7/ Thoát chương trình nhưng thread vẫn chạy
- Thread có 2 loại: ForeGround và BackGround.
+ Chương trình sẽ tắt khi các ForeGround thread chạy xong
+ Còn các BackGroud Thread sẽ dừng lại khi tắt chương trình.
- Lí do là khi ta tạo 1 thread nó mặc định là loại ForeGround
- Để khi tắt chương trình các thread cũng dừng thì ta sẽ chuyển các thread sang BackGround như sau:
t1.IsBackground = true; t1.Start();Chuyển thread thành background trước khi start
8/ Thread Pooling
- Cái này hơn rất rất nhiều. Có thể nói nó tối ưu thread.
- Thread Pooling mặc định là loại BackGround
- Sau khi kết thúc một tác vụ nó sẽ trở về trạng thái sẵn sàng nhận một nhiệm vụ mới
- Chạy một thủ tục, hàm bằng Thread Pooling (thủ tục, hàm phải có đầu vào là 1 Object)
private void Button1_Click() { ThreadPool.QueueUserWorkItem(ThreadPooling, "Test"); //Hoặc: ThreadPool.QueueUserWorkItem(ThreadPooling); } private void ThreadPooling(object obj) { MessageBox.Show(obj.ToString()); }
Nguồn: YinYang's Blog
[ENCODING] Chuyển đổi qua lại giữa các loại mã (Unicode-UTF8-UTF7-ASCII...)
Chào !
Hôm nay mình sẽ hướng dẫn các bạn chuyển đổi các loại mã (Unicode-UTF8-UTF7-ASCII...)
Các bạn có thể hoàn toàn tạo được 1 tool giúp chuyển đổi các loại mã trong Văn bản ^^!
(Ví dụ bạn dùng MS Word đã lỡ dùng Unicode nhưng người ta yêu cầu phải dùng định dạng ASCII hết chẳng hạn ... )
OK. Bắt đầu nhé !
Ở đây mình sẽ ví dụ chuyển mã Unicode sang mã UTF8 :
1. Hãy "using System.Text" để sử dụng lớp Encoding
2. Chuyển dữ liệu về mảng byte :
OK Vậy là đã xong !
Hôm nay mình sẽ hướng dẫn các bạn chuyển đổi các loại mã (Unicode-UTF8-UTF7-ASCII...)
Các bạn có thể hoàn toàn tạo được 1 tool giúp chuyển đổi các loại mã trong Văn bản ^^!
(Ví dụ bạn dùng MS Word đã lỡ dùng Unicode nhưng người ta yêu cầu phải dùng định dạng ASCII hết chẳng hạn ... )
OK. Bắt đầu nhé !
Ở đây mình sẽ ví dụ chuyển mã Unicode sang mã UTF8 :
1. Hãy "using System.Text" để sử dụng lớp Encoding
2. Chuyển dữ liệu về mảng byte :
// Chuyển string szDuLieuUniCode về dạng mảng byte byte[] unicode = Encoding.Unicode.GetBytes(szDuLieuUniCode); // Cover byte unicode sang byte utf8 byte[] utf8 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, unicode); // chuyển từ mảng byte utf8 về dạng string string szDuLieuUTF8 = Encoding.UTF8.GetString(utf8);
OK Vậy là đã xong !
[API] Ini - Ghi các setting cực tốt !
Với một phần mềm có chức năng tùy chỉnh thì việc lưu các setting là rất quan trọng.
Hôm nay mình xin hướng dẫn các bạn một trong các kiểu ghi/đọc các setting cực kì phổ biến -- Đọc/Ghi Ini
1. Tổng quan một file ini
1 file được ghi theo kiểu Ini sẽ có dạng sau đây :
Ví dụ mình muốn lưu cái "Tự động đăng nhập" cho phần mềm của mình thì File ini sẽ có dạng sau :
2. Thực hiện trong C#
2.1 . Đừng quên " using System.Runtime.InteropServices;" để có thể sử dụng các hàm API
2.2. Sử dụng DLL : kernel32
OK vậy là bạn có thể Đọc/Ghi dữ liệu từ file setting theo cách trên
Nếu chưa làm được hãy xem code dưới đây (Bạn chỉ cần sử dụng INI.READ và INI.WRITE thôi)
// Viết thêm 2 hàm mới cho dễ
3. Thực hành
Ví dụ : (Sử dụng class INI được xây dựng bên trên)
[TuDongDangNhap]
TaiKhoan=buiducduy111
KichHoat=1
OK. Nếu chưa hiểu bạn cứ comment ở dưới nhé!
Hôm nay mình xin hướng dẫn các bạn một trong các kiểu ghi/đọc các setting cực kì phổ biến -- Đọc/Ghi Ini
1. Tổng quan một file ini
1 file được ghi theo kiểu Ini sẽ có dạng sau đây :
[Section]
Key=Value
Ví dụ mình muốn lưu cái "Tự động đăng nhập" cho phần mềm của mình thì File ini sẽ có dạng sau :
[TuDongDangNhap]
KichHoat=1
TaiKhoan=buiducduy111
2. Thực hiện trong C#
2.1 . Đừng quên " using System.Runtime.InteropServices;" để có thể sử dụng các hàm API
2.2. Sử dụng DLL : kernel32
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
[DllImport("kernel32")]
private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filepath);
OK vậy là bạn có thể Đọc/Ghi dữ liệu từ file setting theo cách trên
Nếu chưa làm được hãy xem code dưới đây (Bạn chỉ cần sử dụng INI.READ và INI.WRITE thôi)
public class INI
{
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
[DllImport("kernel32")]
private static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filepath);
// Viết thêm 2 hàm mới cho dễ
public static string READ(string szFile, string szSection, string szKey)
{
StringBuilder tmp = new StringBuilder(255);
long i = GetPrivateProfileString(szSection, szKey, "", tmp, 255, szFile);
return tmp.ToString();
}
public static void WRITE(string szFile, string szSection, string szKey, string szData)
{
WritePrivateProfileString(szSection, szKey, szData, szFile);
}
}
3. Thực hành
Ví dụ : (Sử dụng class INI được xây dựng bên trên)
INI.WRITE("Data.ini","TuDongDangNhap","TaiKhoan", "buiducduy");Kết quả trong Data.ini :
INI.WRITE("Data.ini","TuDongDangNhap","KichHoat", "1");
[TuDongDangNhap]
TaiKhoan=buiducduy111
KichHoat=1
string s = INI.READ("Data.ini","TuDongDangNhap","TaiKhoan");Kết quả "buiducduy";
MessageBox.Show(s);
OK. Nếu chưa hiểu bạn cứ comment ở dưới nhé!
[SOFTWARE DESIGN] Thiết kế phần mềm theo mô hình 3 lớp Layer
Hướng tới lập trình chuyên nghiệp (nói cho oai chứ mình gà lắm) - không chỉ về mặt code , thuật toán ... mà bạn cần phải thiết kế phần mềm sao cho dễ chỉnh sửa , cập nhật nhất (nhất là đối với code team và bạn đã định hướng phát triển phần mềm lâu dài)
Hôm nay mình xin giới thiệu một cách thiết kế khá phổ biết là "MÔ HÌNH 3 LỚP LAYER"
1. Giới thiệu tổng quan
Như tên của mô hình. Chúng ta sẽ thiết kế phần mềm theo 3 lớp sau :
- GUI Layer : chuyên xử lí về GUI (giao diện)
- Business Layer : chuyên xử lí về nghiệp vụ, thuật toán....
- Data Access Layer : đưa dữ liệu xuống cơ sở dữ liệu cũng như lấy dữ liệu từ cơ sở dữ liệu lên
Ngoài ra chúng ta dùng thêm 1 class là : Data Transfer Object (DTO) có chức năng là cầu nối giữa các Layer. (Ta cũng có thể dùng các parameter để truyền dữ liệu , tùy nhiên nhiều parameters quá thì nên dùng tên class này)
2. Các bước thiết kế phần mềm theo mô hình 3 lớp layer
Bây giờ chúng ta cùng nhau thiết kế một phần mềm đơn giản nhé ^^
Để đơn giản ở đây tôi không dùng hệ quản trị cơ sở dữ liệu mà ghi dữ liệu ra file "Data.txt" (Coi như nó là DataBase đi :D -- File này sẽ chỉ ghi được 1 tài khoản thôi nhưng đây là ví dụ mà -- các bạn có thể áp dụng vào các hệ quản trị CSDL giống như vậy)
- Thiết kế một GUI như sau :
GUI có 2 textbox : txtTaiKhoan và txtMatKhau và một button : btnDangKi
- Tạo các Folder vào các class như hình dưới đây :
(GUI Layer : frmRegister.cs | Business Layer : XuLi.cs | Data Access Layer : VanChuyenDuLieu.cs
và DTO.cs)
- OK Tiến hành code nhé :
** DTO.cs (Nơi đây chỉ chứa các biến vận chuyển) :
**VanChuyenDuLieu.cs (Nơi đây chỉ có chức năng đọc/ghi dữ liệu xuống CSDL)
Ở phương thức GhiDuLieu tôi sẽ truyền vào đối tượng DTO
** Và cuối cùng là Xử lí nút "Đăng kí ở GUI" như sau :
Hôm nay mình xin giới thiệu một cách thiết kế khá phổ biết là "MÔ HÌNH 3 LỚP LAYER"
1. Giới thiệu tổng quan
Như tên của mô hình. Chúng ta sẽ thiết kế phần mềm theo 3 lớp sau :
- GUI Layer : chuyên xử lí về GUI (giao diện)
- Business Layer : chuyên xử lí về nghiệp vụ, thuật toán....
- Data Access Layer : đưa dữ liệu xuống cơ sở dữ liệu cũng như lấy dữ liệu từ cơ sở dữ liệu lên
Ngoài ra chúng ta dùng thêm 1 class là : Data Transfer Object (DTO) có chức năng là cầu nối giữa các Layer. (Ta cũng có thể dùng các parameter để truyền dữ liệu , tùy nhiên nhiều parameters quá thì nên dùng tên class này)
2. Các bước thiết kế phần mềm theo mô hình 3 lớp layer
Bây giờ chúng ta cùng nhau thiết kế một phần mềm đơn giản nhé ^^
Để đơn giản ở đây tôi không dùng hệ quản trị cơ sở dữ liệu mà ghi dữ liệu ra file "Data.txt" (Coi như nó là DataBase đi :D -- File này sẽ chỉ ghi được 1 tài khoản thôi nhưng đây là ví dụ mà -- các bạn có thể áp dụng vào các hệ quản trị CSDL giống như vậy)
- Thiết kế một GUI như sau :
GUI có 2 textbox : txtTaiKhoan và txtMatKhau và một button : btnDangKi
- Tạo các Folder vào các class như hình dưới đây :
(GUI Layer : frmRegister.cs | Business Layer : XuLi.cs | Data Access Layer : VanChuyenDuLieu.cs
và DTO.cs)
- OK Tiến hành code nhé :
** DTO.cs (Nơi đây chỉ chứa các biến vận chuyển) :
namespace MOHINH3LOPLAYER
{
public class DTO
{
private string _TaiKhoan;
private string _MatKhau;
public string TaiKhoan
{
set {_TaiKhoan = value;}
get {return _TaiKhoan;}
}
public string MatKhau
{
set {_MatKhau = value;}
get {return _MatKhau;}
}
}
}
**VanChuyenDuLieu.cs (Nơi đây chỉ có chức năng đọc/ghi dữ liệu xuống CSDL)
Ở phương thức GhiDuLieu tôi sẽ truyền vào đối tượng DTO
namespace MOHINH3LOPLAYER.Data_Access_Layer** XuLi.cs (Nơi đây chỉ có chức năng xử lí thuật toán)
{
public class VanChuyenDuLieu
{
public static void GhiDuLieu(DTO doituong)
{
FileStream fs = new FileStream("Data.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(doituong.TaiKhoan);
sw.WriteLine(doituong.MatKhau);
sw.Flush();
sw.Close();
}
}
}
namespace MOHINH3LOPLAYER.Business_Layer}
{
public class XuLi
{
private static bool KiemTra(DTO doituong)
{
if (doituong.TaiKhoan != "" && doituong.MatKhau != "")
return true;
return false;
}
public static bool DangKi(DTO doituong)
{
if (!KiemTra(doituong))
return false;
MOHINH3LOPLAYER.Data_Access_Layer.VanChuyenDuLieu.GhiDuLieu(doituong);
return true;
}
}
** Và cuối cùng là Xử lí nút "Đăng kí ở GUI" như sau :
// Tạo đối tượng DTO
private void btnDangKI_Click(object sender, EventArgs e)
{
DTO doituong = new DTO();
doituong.TaiKhoan = this.txtTaiKhoan.Text;
doituong.MatKhau = this.txtMatKhau.Text;
if (MOHINH3LOPLAYER.Business_Layer.XuLi.DangKi(doituong))
{
MessageBox.Show("Đăng kí thành công");
}
else
{
MessageBox.Show("Đăng kí thất bại");
}
}
OK như vậy là xong ^^! Đơn giản đúng không :D
Code quay lui bằng C# tìm tổ hợp, chỉnh hợp chập k của n
thuvienwinform - Thuật toán trâu bò quen thuộc và khá hữu ích trong việc code. Để tìm tổ hợp đơn giản là tìm một dãy số thỏa mãn điều kiện sau:
- Các số đều khác nhau
- Số sau lớn hơn số trước
- Các bộ số không trùng lặp nhau
-...
Thuật toán quay lui với vòng lặp sẽ bắt đầu từ a[i-1] đề thỏa mãn điều kiện các số khác nhau và số sau lớn hơn số trước. Trong quá trình duyệt kết hợp đánh dấu phần tử đã sử dụng để không bị trùng (ở trong này mình dùng mảng dau)
Khi tìm đủ k phần tử cho mảng a thì xuất ra.
Về lí thuyết quay lui có thể tham khảo trong sách giải thuật và lập trình của Lê Minh Hoàng
Với code này chuyển thành tính chỉnh hợp cũng không có gỉ cả, chỉ cẩn thay vòng lặp thành thế này là OK
Các số trong bộ số sẽ không phải là từ a[i-1] nữa mà là từ 1
- Các số đều khác nhau
- Số sau lớn hơn số trước
- Các bộ số không trùng lặp nhau
-...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace QuayLuiTimToHop { class Program { #region Khai báo static int n, k; static int[] a, dau; #endregion #region THủ tục private static void Xuat(int i) { for (int j = 1; j <= k; j++) Console.Write(a[j] + " "); Console.WriteLine(); } private static void Duyet(int i) { if (i > k) Xuat(i); else { int j; for (j = a[i - 1]; j <= n; j++) { if (dau[j] == 0) { a[i] = j; dau[j] = 1; Duyet(i+1); dau[j] = 0; } } } } #endregion static void Main(string[] args) { #region Đầu vào Console.Write("Nhap va n: "); n = Convert.ToInt32(Console.ReadLine()); Console.Write("Nhap va k: "); k = Convert.ToInt32(Console.ReadLine()); a = new int[n+1]; dau = new int[n+1]; for (int i = 0; i < n + 1; i++) dau[i] = 0; #endregion #region Xử lí Console.WriteLine("To hop chap " + k + " cua " + n + ": "); a[0] = 1; Duyet(1); #endregion Console.ReadKey(); } } }Dãy cần tìm là a
Thuật toán quay lui với vòng lặp sẽ bắt đầu từ a[i-1] đề thỏa mãn điều kiện các số khác nhau và số sau lớn hơn số trước. Trong quá trình duyệt kết hợp đánh dấu phần tử đã sử dụng để không bị trùng (ở trong này mình dùng mảng dau)
Khi tìm đủ k phần tử cho mảng a thì xuất ra.
Về lí thuyết quay lui có thể tham khảo trong sách giải thuật và lập trình của Lê Minh Hoàng
Với code này chuyển thành tính chỉnh hợp cũng không có gỉ cả, chỉ cẩn thay vòng lặp thành thế này là OK
Các số trong bộ số sẽ không phải là từ a[i-1] nữa mà là từ 1
for (j = 1; j <= n; j++) { if (dau[j] == 0) { a[i] = j; dau[j] = 1; Duyet(i+1); dau[j] = 0; } }
[API] Phát nhạc MP3
Như chúng ta đã biết thư viện "System.Media" chỉ cho phép chạy file âm thanh ".wav" nhiều chúng ta chạy file MP3 rất khó khăn (làm một chương trình phát nhac đơn giản chẳng hạn -- không dùng dll của Windows Media đâu nhé)
Hôm nay mình sẽ hướng dẫn các bạn sử dụng API để chạy file MP3 trong C#.
Các bước như sau :
1. Đừng quên "using System.Runtime.InteropServices;" để sử dụng API nhé.
2. Import Dll "winmm.dll"
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
Hàm API này không hẳn có chức năng chạy MP3 mà nó là 1 hàm cho phép thực hiện câu lệnh được Coder đưa vào qua 1 string là strCommad . như vậy parameters này là quan trọng nhất (và mình cũng không biết các param khác có chức năng gì -- thôi thì cứ null -- API thường vậy mà HIHI ^^)
3. Giới thiệu các Commad để chạy 1 file MP3
- Mở MP3 : "open "Đường dẫn tới file mp3" type mpegvideo alias MediaFile"
ví dụ : "open "E:\MUSIC\nhac.mp3" type mpegvideo alias MediaFile"
- Chạy MP3 vừa mở : "play MediaFile"
Có thể dùng "play MediaFile REPEAT" để phát đi phát lại file MP3 vừa mở
- Dừng MP3 : "close MediaFile"
Nếu chưa làm được hãy xem ví dụ này :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MP3// Import Dll này vô
{
public partial class Form1 : Form
{
public bool isOpen = false;
public Form1()
{
InitializeComponent();
}
[DllImport("winmm.dll")]'
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
// BUTTON PLAY MP3
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog op = new OpenFileDialog();
op.Filter = "MP3 (*.mp3)|*.mp3";
if (op.ShowDialog() == DialogResult.OK)
{
string szFile = op.FileName;
MP3Open(szFile);
Mp3Play(false);
}
}
// BUTTON STOP MP3
private void button2_Click(object sender, EventArgs e)
{
Mp3Close();
}
// PHẦN XỬ LÍ ----------------------------------------------------------------------------------
public void MP3Open(string szFileName)
{
string szCommad = "open \"" + szFileName + "\" type mpegvideo alias MediaFile";
MessageBox.Show(szCommad);
mciSendString(szCommand, null, 0, IntPtr.Zero);
isOpen = true;
}
public void Mp3Close()
{
string szCommand = "close MediaFile";
mciSendString(szCommand, null, 0, IntPtr.Zero);
isOpen = false;
}
public void Mp3Play(bool isLoop)
{
if (isOpen)
{
string szCommand = "play MediaFile";
if (isLoop) szCommand += " REPEAT";
mciSendString(szCommand, null, 0, IntPtr.Zero);
}
}
}
}