12/27/13

[C#] Tạo chương trình dạng Single-instance - chỉ có một ứng dụng chạy trong task manager

Đôi lúc chúng ta cần ngăn cản ứng dụng khởi chạy nhiều lần để làm giảm phiền toái cho người dùng. Vậy có cách nào để làm được điều này hay không. Sau đây tôi hướng đẫn bạn cách đơn giản nhất mà tôi hay dùng. Tuy nhiên tôi chỉ hướng đẫn phần cơ bản còn vận dụng như thế nào thì tùy ở mỗi người.

-Có 1 số cách để giải quyết vấn đề này, hay gặp là sử dụng Mutex và Process. Tuy nhiên chúng chỉ kiểm tra xem 1 instance của chuơng trình có đang chạy hay ko và ko thể điều khiển được instance đó (như việc active cửa sổ chính chẳng hạn).

Cách 1:
Sử dụng class System.Diagnostics.Process. Sau đây là đoạn code minh họa.


Ở đây cần chú ý rằng. Cần phải kiểm tra Length >= 1 thì mới kết luận là ứng dụng đã khởi chạy rồi. Vì ứng dụng mình vừa chạy lên và ứng dụng cũ đang chạy là hai. Nếu có từ hai cái trở lên thì ứng dụng vừa chạy lên sẻ tắt process của nó đi. Vì vậy sẻ đảm bảo là một ứng dụng không có 2 Process chạy song song.
Cách này được tôi dùng phổ biến. Tuy nhiên phải tùy tùy biến lại chút ít cho trường hợp hai ứng dụng khác nhau nhưng được đặt trùng tên….


Cách 2  :
Bây giờ mình sẽ hướng dẫn sử dụng 1 cách khá mới tận dụng thư viện Visual Basic trong .Net. Trước khi gõ code bạn hãy add reference thư viện Microsoft.VisualBasic vào.
AddReference
Phải add thư viện này bạn mới có thể dùng using Microsoft.VisualBasic.ApplicationServices mà ta sẽ sử dụng trong bài được.
Sửa file Program.cs như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsApplication1
{
static class Program
{
// Form chính cần gọi của chương trình phải đặt là static
static Form1 frm;
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
frm = new Form1();
SingleInstanceApplication.Run(frm, NewInstanceHandler);
}
public static void NewInstanceHandler(object sender,
StartupNextInstanceEventArgs e)
{
// Kích hoạt cửa sổ của instance đang chạy
// Bạn có thể thay thế bằng 1 hành động khác
frm.Activate();
}
/// <summary>
/// Lớp này dùng để gọi chạy form dạng single instance
/// </summary>
public class SingleInstanceApplication : WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form f,
StartupNextInstanceEventHandler startupHandler)
{
SingleInstanceApplication app = new SingleInstanceApplication();
app.MainForm = f;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
}
}
Như bạn có thể thấy
Trích dẫn:
app.Run(Environment.GetCommandLineArgs());
Bạn có thể dễ dàng điều khiển instance đã chạy của mình bằng cách thiết lập các hành động sẽ xử lý tùy thuộc vào các tham số sẽ truyền vào thông qua dòng lệnh. Khi đó bạn có thể khởi tạo form như sau:
Code:
frm=new Form1(args[0]);
và trong constructor của Form1 bạn sẽ viết code kiểm tra và xử lý, ví dụ args[0]==”/scan” thì thực hiện lệnh scan máy chẳng hạn.
Hi vọng bài viết này giúp đỡ giải quyết 1 số vấn đề mà các bạn gặp phải.

12/20/13

[ADO.NET] Sử dụng SQL - Transaction với C#

Giả sử bạn có bảng sản phẩm với các thông tin như sau:
  1. create table Product  
  2. (  
  3. ProductID     int not null primary key identity,  
  4. ProductName varchar (50) not null,  
  5. Description varchar(1000) not null,  
  6. Price money  
  7. )  

Thủ tục sử dụng để lưu thông tin một sản phẩm vào cơ sở dữ  liệu có thể viết theo một trong hai cách sau:
  1. create procedure spInsertProduct  
  2. (  
  3. -- Khai báo biến, biến này phải có kiểu dữ liệu giống như trong CSDL  
  4. @name varchar(50),      
  5. @description varchar(1000),  
  6. @price money  
  7. -- Biến trả về kết quả thực thi  
  8. @result int output  
  9. )   
  10. as  
  11.       begin transaction  
  12.              insert into Product (ProductName, Description, Price ) values(@name,@description,@price)  
  13.       if @@ERROR <> 0  
  14.     begin               
  15.         -- Có lỗi xảy ra, rollback transaction  
  16.         set @result=0  
  17.         ROLLBACK  
  18.     end  
  19.       else  
  20.     begin  
  21.         --  Thành công! commit the transaction  
  22.         set @result=1  
  23.         COMMIT  
  24.     end  


hoặc

  1. create procedure spInsertProduct  
  2. (  
  3. -- Khai báo biến, biến này phải có kiểu dữ liệu giống như trong CSDL  
  4. @name varchar(50),      
  5. @description varchar(1000),  
  6. @price money  
  7. -- Biến trả về kết quả thực thi  
  8. @result int output  
  9. )   
  10. as  
  11.       begin try  
  12.     begin transaction  
  13.         insert into Product (ProductName, Description, Price ) values  
  14.   
  15. (@name,@description,@price)  
  16.         --Nếu chạy đến câu lệnh tiếp theo --> thực thi thành công  
  17.         set @result=1  
  18.         COMMIT  
  19.       end try  
  20.   
  21.       begin catch  
  22.       
  23.           if @@TRANCOUNT > 0  
  24.         begin               
  25.             -- Có lỗi xảy ra, rollback transaction  
  26.             set @result=0  
  27.             ROLLBACK  
  28.         end  
  29.      end catch  


Trong phần mã C# ứng dụng, bạn thực hiện gọi thực thi thủ tục và kiểm tra kết quả trả về:




  1. // strConn is your connection string   
  2. SqlConnection cn = new SqlConnection(strConn);  
  3. SqlCommand cmd = cn.CreateCommand();  
  4. cmd.CommandText = "spInsertProduct";  
  5. cmd.CommandType = CommandType.StoredProcedure;  
  6.   
  7. cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);  
  8. cmd.Parameters["@name"].Direction = ParameterDirection.Input;  
  9. cmd.Parameters["@name"].Value = txtName.Text;  
  10.   
  11. cmd.Parameters.Add("@description", SqlDbType.VarChar, 1000);  
  12. cmd.Parameters["@description"].Direction = ParameterDirection.Input;  
  13. cmd.Parameters["@description"].Value = txtDescription.Text;  
  14.   
  15. cmd.Parameters.Add("@result", SqlDbType.Int);  
  16. cmd.Parameters["@result"].Direction = ParameterDirection.ReturnValue;  
  17. cn.Open();  
  18. cmd.ExecuteNonQuery();  
  19. cn.Close();  
  20. int result = Convert.ToInt32(cmd.Parameters["@result"].Value);  
  21. // kiểm tra giá trị trả về  
  22. if(result==1)  
  23. MessageBox.Show("Success");   
  24. else  
  25. MessageBox.Show("Error");   


12/12/13

[C#] Cách lưu hình ảnh vào file DLL và sử dụng

Khi lập trình ứng dụng, hình ảnh là một thứ không thể thiếu để làm đẹp thêm ứng dụng. Nhưng nếu bạn add thẳng vào resource của ứng dụng thì khi build ra file exe sẽ rất nặng và làm chậm ứng dụng khi khởi động. Nếu tạo 1 thư mục và chứa hình ảnh rồi tham chiếu đến thì cũng được nhưng không hay, nó có cảm giác không chuyên nghiệp và lỡ ai đó xóa mất thì ứng dụng sẽ bị khuyết hình ảnh chỗ đó. Vậy giải pháp là tạo 1 file dll chứa các hình ảnh rồi tham chiếu đến dll đó để lấy hình ảnh ra hiển thị. Làm như vậy ta sẽ có cảm giác ứng dụng sẽ chuyên nghiệp hơn (đó là cảm giác của mình) và mọi người thấy file dll cũng ko dám xóa linh tinh (theo cảm nghĩ của mình là như vậy Open-mouthed smile)
Thôi không nói dài dòng nữa, tóm lại là đây chỉ là một cách để sử dụng hình ảnh trong ứng dụng, các bạn có thể không làm theo cũng chả sao vì nó có vài cách, ứng dụng nhỏ thì cứ add thẳng vào resource cho nó đơn giản. Bắt đầu nhé.
Bước 1: Tạo 1 project Windows Form Application đặt tên tùy ý
1
Bước 2: Add thêm 1 class library vào ứng dụng để tạo 1 file dll chứa hình ảnh
Bước 3: Add 1 resource file vào class library trên.
2
Bước 4: Add 1 vài hình ảnh vào resource file đó
3
Bước 5: Mở class1.cs ra và gõ vào đoạn code như hình sau
4
Bước 6: Build Class Library này => ta được 1 file dll.
Bước 7: Add file dll vào ứng dụng Windows Form Application
5
Bước 8: Sử dụng
6
Kết quả sau khi chạy chương trình
7
Vậy là xong rồi đó. Chúc các bạn thành công!