This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

dfgdgdfg dfg dfgd fgdf dfgdfgd

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

Chủ Nhật, 23 tháng 8, 2015

Mô hình 3 lớp là gì - Three Layer

Understanding Three-Layer Model
Để dễ quản lý các thành phần của hệ thống, cũng như không bị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành phần có cùng chức năng lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau. Một trong những mô hình lập trình như vậy đó là Mô hình 3 lớp (Three Layers).

Các thành phần trong 3 - Layer

Mô hình 3 lớp được cấu thành từ: Presentation Layers, Business Logic Layers, và Data Access Layers.

Click image for larger version.   Name: 3-layer.jpg  Views: 10  Size: 28.7 KB  ID: 141

Presentation Layers
Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập dữ liệu và hiển thị kết quả/dữ liệu thông qua các thành phần trong giao diện người sử dụng. Trong .NET thì bạn có thể dùng Windows Forms, ASP.NET hay Mobile Forms để hiện thực lớp này.

Lưu ý: Lớp này không nên sử dụng trực tiếp các dịch vụ của lớp Data Access mà nên sử dụng thông qua các service của lớp Business Logic vì khi bạn sử dụng trực tiếp như vậy, bạn có thể bỏ qua các ràng buộc, các logic nghiệp vụ mà ứng dụng cần phải có. Và hơn nữa nếu sử dụng như vậy thì đâu cần đến 3 lớp phải không bạn?
Business Logic Layer
Đây là layer xử lý chính các dữ liệu trước khi được đưa lên hiển thị trên màn hình hoặc xử lý các dữ liệu trước khi chuyển xuống Data Access Layer để lưu dữ liệu xuống cơ sở dữ liệu.
Đây là nơi đê kiểm tra ràng buộc, các yêu cầu nghiệp vụ, tính toán, xử lý các yêu cầu và lựa chọn kết quả trả về cho Presentation Layers.

Data Access Layer
Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất dữ liệu của ứng dụng như đọc, lưu, cập nhật cơ sở dữ liệu.

Cách vận hành của mô hình
Đối với 3-Layer, yêu cầu được xử lý tuần tự qua các layer như hình.
- Đầu tiên User giao tiếp với Presentation Layers (GUI) để gửi đi thông tin và yêu cầu. Tại layer này, các thông tin sẽ được kiểm tra, nếu OK chúng sẽ được chuyển xuống Business Logic Layer (BLL).
- Tại BLL, các thông tin sẽ được nhào nặn, tính toán theo đúng yêu cầu đã gửi, nếu không cần đến Database thì BLL sẽ gửi trả kết quả về GUI, ngược lại nó sẽ đẩy dữ liệu (thông tin đã xử lý) xuống Data Access Layer (DAL).
- DAL sẽ thao tác với Database và trả kết quả về cho BLL, BLL kiểm tra và gửi nó lên GUI để hiển thị cho người dùng.
- Một khi gặp lỗi (các trường hợp không đúng dữ liệu) thì đang ở layer nào thì quăng lên trên layer cao hơn nó 1 bậc cho tới GUI thì sẽ quăng ra cho người dùng biết
- Các dữ liệu được trung chuyển giữa các Layer thông qua một đối tượng gọi là Data Transfer Object (DTO), đơn giản đây chỉ là các Class đại diện cho các đối tượng được lưu trữ trong Database.

Tổ chức mô hình 3 - Layer
Có rất nhiều cách đặt tên cho các thành phần của 3 lớp như:
Cách 1: GUI, BUS, DAL
Cách 2: GUI, BLL, DAO, DTO
Cách 3: Presentation, BLL, DAL

Click image for larger version.   Name: 3layer_1.jpg  Views: 14  Size: 26.8 KB  ID: 142

Reference
Mô hình 3-Layer trong .NET 
http://msdn.microsoft.com/en-us/library/ee658109.aspx 
Application Architecture for .NET: Designing Applications and Services (PDF)
- Demo C# Northwind-3Layer 
- Demo C# Bookshop-3Layer

Nguồn: http://www.blogit.info

Thứ Sáu, 21 tháng 8, 2015

Đóng gói phần mềm + Database


Sau khi viết xong phần mềm, để đóng gói thành file cài đặt gvà chạy được trên máy không cài SQL Server cần làm như sau:

1. Right click vào Solution của bạn > Add > New Project...

2. Trong cửa sổ New Project > Orther Project Types > Setup Project > Đặt tên > chỉ đường dẫn lưu file setup của bạn > OK.

3. Sau khi tạo xong Setup Project trong Solution Explorer của bạn sẽ có xuất hiện Project bạn vừa tạo. Right Click vào Project đó > Add > Project Output.

4. Trong cửa sổ Project Output chọn Primary output > OK.

5. Right click vào Project Setup vừa tạo > Properties > Prerequisites > Check vào .NET Framework, SQLEXPRESS 2005 > Check vào radio button ở giữa (download .... my applications) > OK.

6. Để tạo shortcut ngoài desktop bạn vào Application Folder > Right click vào file Primary output ... > Chọn Creat shortcut .... > Đổi tên shortcut theo ý bạn.
- Bạn tìm một file *.ico rồi add vào application folder bằng cách right lick vào folder application folder > Add > Files...> chỉ đường dẫn tới file icon của bạn.
- Sau đó right click vào shortcut vừa tạo chọn properties > trong properties tìm đến dòng icon > Browser > Application folder > chọn file icon vừa add > OK.
- Kéo shortcut vừa tạo thả vào folder user's desktop

7. Add thêm file SQL của bạn gồm 2 file là *.mdf và *.ldf vào application folder.

8. Tạo câu lệnh attach file *.mdf của bạn vào SQLEXPRESS 2005:
datasource=.\SQLEXPRESS;attachdbfilename=c:\Progra m Files\tên project setup của bạn\tên file mdf;Integrated Security=true;user instanced=true;connect timeout=30;
- vd: datasource=.\SQLEXPRESS;attachdbfilename=c:\Progra m Files\Setup1\QLST.mdf;Integrated Security=true;user instanced=true;connect timeout=30;
đường dẫn này chỉ hoạt động được khi bạn cài chương trình của bạn vào máy cài win xp.
nếu là win vista hay win 7 bạn phải thêm một chút là:
- vd: Server=.\SQLExpress;AttachDbFilename=|DataDirector y|mydbfile.mdf; Database=dbname;Trusted_Connection=Yes;

9. Right click vào project output > Build...

10. Cài đặt và chạy thôi:
Trong quá trình cài đặt chương trình sẽ tự kiểm tra xem máy đã có .NET Framework và SQLEXPRESS 2005 chưa. nếu chưa có sẽ tiến hành cài đặt, sau đó mới cài chương trình của bạn viết, nếu có rồi thì chỉ cài chương trình của bạn viết thôi.

-Nếu database của bạn là access thì càng đơn giản hơn:
chỉ cần add file access đó vào application folder là xong.

Suu tam

Example that uses ProgressBar and BackgroundWorker: C#

Example that uses ProgressBar and BackgroundWorker: C#

using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, System.EventArgs e)
{
// Start the BackgroundWorker.
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
// Wait 100 milliseconds.
Thread.Sleep(100);
// Report progress.
backgroundWorker1.ReportProgress(i);
}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Change the value of the ProgressBar to the BackgroundWorker progress.
progressBar1.Value = e.ProgressPercentage;
// Set the text.
this.Text = e.ProgressPercentage.ToString();
}
}
}

Ví dụ về Download Manager


Có rất nhiều chương trình minh họa download. Ở đây Tôi chọn 1 ví dụ nhỏ và dễ hiểu từ trên internet để cung cấp lại cho các bạn. Các bạn có thể thấy nó bất cứ đâu trên internet. http://www.mediafire.com/?cb9l6imuuh8e0i9
Ở đây Tôi sửa lại chương trình gốc 1 chút xíu, đó là Tôi tạo 1 User Control và đưa sắp xếp lại giống như hình bên trên mà các bạn Thấy.
Mỗi lần bấm Add URL to download thì user control sẽ được add vào FlowPanel như trên. Bạn xem mấy Properties Tôi thêm vào:
public Panel MyPanel { get; set; }
public string MyFileFromServer { get; set; }
public string MyFileToClient { get; set; }
Mục đích Tôi tách ra như vậy để minh họa multi download.
Có rất nhiều chương trình rất hay nhưng mà coding phức tạp nên Tôi chưa cung cấp, các bạn cũng có thể tìm thấy nó trên internet.
Theo duythanhcse

Cách tạo setup project visual studio với Sql server


Tạo Solution có chứa 3 Project bên như dưới:
Project QLSVApplication: là ứng dụng dùng để hiển thị thông tin sinh viên, chỉ là 1 Datagridview để hiển thị lên.
Project SetupEngine : là Project loại Libraries, project này chúng ta sẽ thêm loại Installer đặt tên là InstallerEngine (Class này có nhiệm vụ cài đặt Cơ sở dữ liệu vào máy tính, với các thông số được truyền vào từ quá trình cài đặt do ta quy định). Ta sẽ nhúng các SQL Script mà SQLServer cung cấp cho ta vào đây với tên sqldata.txt và sqldropcreate.txt (nhớ đặt tên viết thường, ta sẽ đi vào chi tiết ở phần sau)
Ta sẽ biên dịch project này thành dll để sử dụng trong Project QLSVSetup.
Project QLSVSetup : Dùng để cài đặt ứng dụng QLSVApplication vào máy tính, và ra lệnh cho SetupEngine cài đặt cơ sở dữ liệu
Bước  1: Tạo ứng dụng sử dụng
Project QLSVApplication:
Trong project này đơn giản chỉ là hiển thị thông tin, chuỗi kết nối sẽ được đọc từ app.config. Chuỗi này sẽ được cấp nhập trong quá trình cài đặt vào máy tính.
Bước 2: Tạo Project để cài đặt CSDL
Project SetupEngine: Project dùng để tạo CSDL, Project này chúng ta nhớ chọn loại Libraries
–          Để tạo class Installer như trong project: Bấm chuột phải vào Project/ chọn Add / New Item . Trong của sổ mới hiện lên chúng ta tìm tới loại Installer Class, đặt tên class là InstallerEngine
–          Đặt tên class InstallerEngine rồi nhấn Add
–          Tiếp tục tạo 2 Text File để lưu SQL Script (các Script này được lấy bằng công cụ SQL Server cho lẹ).  Ở đây ta chia làm 2 tập tin  SQL Script bởi vì lý do sau: Thao tác tạo CSDL cần phải có thời gian chờ để nó kịp update vào SQL Server. Ta cho chờ 1 thời gian sau đó mới tiếp tục chạy các SQL Script về tạo bảng, insert dữ liệu…
–          Để tạo Text File: Bấm chuột phải vào Project / Add/ New Item / chọn Text  File và nhập tên
–          Trên đây là tạo Text File tên sqldropcreate.txt , chú ý nhớ đặt tên viết thường toàn bộ.
–          Sau khi tạo xong tập tin sqldropcreate.txt, chép đoạn Script tạo CSDL vào đây (xem hình ):
–>Các script này có sẵn do SQL Server tự  tạo nên ta chỉ cần copy từ đó vào đây (nhớ bỏ hết các dòng có chữ Go)
–          Tiếp theo ta phải cấu hình để 2 Text File này được nhúng vào Resource sau khi biên dịch.
–          Trong Properties: Lần lượt chọn 2 Text File trên và chọn Embedded Resource trong Build Action
–          Bây giờ chúng ta tiến hành chỉnh sủa class InstallerEngine:
using System;using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Configuration.Install;
using System.Linq;
using System.IO;
using System.Reflection;
using System.Data.SqlClient;
using System.Xml;
using System.Collections.Specialized;
namespace SetupEngine
{
[RunInstaller(true)]
public partial class InstallerEngine : System.Configuration.Install.Installer
{
private string logFilePath =””;
private string pathApp = “”;
public InstallerEngine()
{
InitializeComponent();
}
private string GetSql(string Name)
{
try
{
// Gets the current assembly.
Assembly Asm = Assembly.GetExecutingAssembly();
// Resources are named using a fully qualified name.
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + “.” + Name);
// Reads the contents of the embedded file.
StreamReader reader = new StreamReader(strm);
string sInfor = reader.ReadToEnd();
Log(sInfor);
reader.Close();
return sInfor;
}
catch (Exception ex)
{
Log(ex.ToString());
throw ex;
}
}
private void ExecuteSql(string serverName, string dbName, string userid, string password, string Sql)
{
string connStr = “server =” + serverName + “;database =” + dbName + “;uid=” + userid + “;pwd=” + password;
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
SqlCommand cmd = new SqlCommand(Sql);
conn.Open();
cmd.Connection = conn;
int n = cmd.ExecuteNonQuery();
Log(” n= ” + n);
conn.Close();
}
catch (Exception ex)
{
Log(ex.ToString());
}
}
}
protected void AddDBTable(string serverName, string userid, string password)
{
try
{
// Creates the database and installs the tables.
string strScript = GetSql(“sqldropcreate.txt”);
ExecuteSql(serverName, “master”, userid, password, strScript);
System.Threading.Thread.Sleep(60 * 1000);
strScript = GetSql(“sqldata.txt”);
ExecuteSql(serverName, “dbqlsv”, userid, password, strScript);
System.Threading.Thread.Sleep(60 * 1000);
string connStr = “server =” + serverName + “;database =dbqlsv;uid=” + userid + “;pwd=” + password;
Log(“AppPath=” + pathApp);
XmlDocument xmlDom = new XmlDocument();
xmlDom.Load(pathApp);
// Get XML node
XmlNode xmlNode = xmlDom.SelectSingleNode(
“configuration/appSettings/add[@key=’MYCONN’]”);
xmlNode.Attributes[“value”].Value = connStr;
// Updating connection string in file
Log(“Followind node of config file will be updated: ” + xmlNode.InnerXml);
// Save to disk
xmlDom.Save(pathApp);
}
catch (Exception ex)
{
//Reports any errors and abort.
Log(ex.ToString());
throw ex;
}
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string assemPath = this.Context.Parameters[“assemblypath”];
int pos = assemPath.LastIndexOf(“\”);
logFilePath = assemPath .Substring(0,pos+1)+ “\SetupLog117.txt”;
pathApp = assemPath.Substring(0, pos + 1) + “\QLSVApplication.exe.config”;
Log(“—-Setup started—-“);
Log(“Server=” + this.Context.Parameters[“servername”] + ” ; User Id=” + this.Context.Parameters[“userid”] + ” ; pwd=” + this.Context.Parameters[“password”]);
foreach (DictionaryEntry s in this.Context.Parameters)
{
Log(“Parameter : “+s.Key +” ; value =”+s.Value);
}
AddDBTable(this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]);
}
public void Log(string str)
{
StreamWriter Tex;
try
{
Tex = File.AppendText(this.logFilePath);
Tex.WriteLine(DateTime.Now.ToString() + ” ” + str);
Tex.Close();
}
catch
{ }
}
}
}
Giải thích một số dòng lệnh bên trên:
Hàm GetSql(string Name) : Dùng để đọc 2 Text File Sql Script. Vì 2 tập tin này chúng ta nhúng vào Assembly nên cơ chế đọc tập tin sẽ là như vậy (xem code).
Lệnh : this.Context.Parameters[“assemblypath”]; lấy đúng đường dẫn mà lúc cài đặt chương trình người sử dụng chọn.
Key assemblypath là có sẵn, phải viết y chang.
this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]
còn servernam, userid, password là do chúng ta quy định, do chúng ta đặt bên Project Setup, 3 biến này phải đặt y chang như 3 biến mà bên Project Setup ta đã đặt.
void AddDBTable(string serverName, string userid, string password) có nhiệm vụ xóa và tạo mới  CSDL sau đó tạo các bảng, dữ liệu. sau khi tạo xong thì tự động cập nhập file App.config cho chương trình (dùng xml).
Bước 3: Tạo Project Setup
Chọn Setup project: đặt tên QLSVSetup rồi bấm OK.
Bấm chuột phải vào QLSVSetup/ chọn File System:
Tại cửa sổ này ta bấm chuột vào thư mục Application Folder, để có được thông tin như bên phải của hình ta làm như sau:
Bấm chuột phải vào Application Folder / Add/ Project Output…
Tiếp tục thêm các tập tin ứng dụng và app.config bên Project QLSVApplication vào đây:
Bấm chuột phải vào Application Folder / Add/ File:
Kết quả:
Để tạo Shortcut cho ứng dụng sau khi cài đặt thì ta bấm chuột phải vào QLSVApplication.exe
Sau đó cắt vào User’s Desktop hay User’s programs Menu, ta có thể tạo bất kỳ thư mục nào bên nhánh trái, rồi chép Shortcut vào đó, có thể tạo nhiều shortcut.
Tiếp theo ta cấu hình giao diện cài đặt, bấm chuột vào QLSVSetup, bên trên ta chọn Icon User Interface Editor:
Màn hình User interface sẽ xuất hiện:
Cửa sổ Add Dialog hiển thị lên:
Cấu hình  TextBoxes (A) như hình chụp bên dưới:
Các tên : CUSTOMTEXTA1, CUSTOMTEXTA2, CUSTOMTEXTA3 là do ta đặt để bên Custom Action có thể tham chiếu lấy giá trị từ màn hình cài đặt. Không dùng Edit4Property nên to cho Edit4Visible =false
–          Tiếp theo, cấu hình Custom Action: Bấm chuột phải vào QLSVSetup/ chọn View/ chọn Custom Actions
Tại cửa sổ Custom Actions, Bấm chuột phải vào Install / chọn Add Custom Action…
Chọn Primary ouput from SetupEngine (active) rồi bấm OK.
Sau đó click chuột vào Primary output, quan sát Properties, Ta cấu hình CustomActionData như hình:
/servername=[CUSTOMTEXTA1] /userid=[CUSTOMTEXTA2] /password=[CUSTOMTEXTA3]
Ta viết y chang như trên, chú ý là 3 biến servername, userid, password ta đặt bên này được sử dụng cho bên SetupEngine :
this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]
Tức là ở đây ta đặt tên gì thì bên SetupEngine phải lấy đúng tên ta đặt bên này
CUSTOMTEXTA1 , CUSTOMTEXTA2, CUSTOMTEXTA3 là do ta đặt cho các EditPropertie của Textboxes (A)
Bước 4: biên dịch và cài đặt
–          Cấu hình QLSVSetup như bên dưới
Chọn Rebuild để biên dịch Setup.
Sau đó chọn Install để cài đặt:
Các bước cài đặt:
  1. BẤM next, tự động xuất hiện màn hình cấu hình CSDL (chính là Textboxes (A))
2. Nhập thông tin và bấm Next:
3. Chọn đường dẫn cài đặt và bấm Next … cứ vậy là xong. Chương trình sẽ cài đặt ứng dụng đồng thời cài đặt SQL luôn (có cập nhật kết nối cho ta luôn)
Kết quả quan sát màn hình Desktop và khởi động chương trình:
Tải tập tin hướng dẫn chi tiết tại đây : http://www.mediafire.com/?16y4jy4pwpq1mpj
Tải source code tại đây: http://www.mediafire.com/?35rflfc15bdav5v
Chúc các bạn thành công

Cách tạo setup project visual studio với Sql server

 
 
 
 
 
 
2 Votes

Tạo Solution có chứa 3 Project bên như dưới:
Project QLSVApplication: là ứng dụng dùng để hiển thị thông tin sinh viên, chỉ là 1 Datagridview để hiển thị lên.
Project SetupEngine : là Project loại Libraries, project này chúng ta sẽ thêm loại Installer đặt tên là InstallerEngine (Class này có nhiệm vụ cài đặt Cơ sở dữ liệu vào máy tính, với các thông số được truyền vào từ quá trình cài đặt do ta quy định). Ta sẽ nhúng các SQL Script mà SQLServer cung cấp cho ta vào đây với tên sqldata.txt và sqldropcreate.txt (nhớ đặt tên viết thường, ta sẽ đi vào chi tiết ở phần sau)
Ta sẽ biên dịch project này thành dll để sử dụng trong Project QLSVSetup.
Project QLSVSetup : Dùng để cài đặt ứng dụng QLSVApplication vào máy tính, và ra lệnh cho SetupEngine cài đặt cơ sở dữ liệu
Bước  1: Tạo ứng dụng sử dụng
Project QLSVApplication:
Trong project này đơn giản chỉ là hiển thị thông tin, chuỗi kết nối sẽ được đọc từ app.config. Chuỗi này sẽ được cấp nhập trong quá trình cài đặt vào máy tính.
Bước 2: Tạo Project để cài đặt CSDL
Project SetupEngine: Project dùng để tạo CSDL, Project này chúng ta nhớ chọn loại Libraries
–          Để tạo class Installer như trong project: Bấm chuột phải vào Project/ chọn Add / New Item . Trong của sổ mới hiện lên chúng ta tìm tới loại Installer Class, đặt tên class làInstallerEngine
–          Đặt tên class InstallerEngine rồi nhấn Add
–          Tiếp tục tạo 2 Text File để lưu SQL Script (các Script này được lấy bằng công cụ SQL Server cho lẹ).  Ở đây ta chia làm 2 tập tin  SQL Script bởi vì lý do sau: Thao tác tạo CSDL cần phải có thời gian chờ để nó kịp update vào SQL Server. Ta cho chờ 1 thời gian sau đó mới tiếp tục chạy các SQL Script về tạo bảng, insert dữ liệu…
–          Để tạo Text File: Bấm chuột phải vào Project / Add/ New Item / chọn Text  File và nhập tên
–          Trên đây là tạo Text File tên sqldropcreate.txt , chú ý nhớ đặt tên viết thường toàn bộ.
–          Sau khi tạo xong tập tin sqldropcreate.txt, chép đoạn Script tạo CSDL vào đây (xem hình ):
–>Các script này có sẵn do SQL Server tự  tạo nên ta chỉ cần copy từ đó vào đây (nhớ bỏ hết các dòng có chữ Go)
–          Tiếp theo ta phải cấu hình để 2 Text File này được nhúng vào Resource sau khi biên dịch.
–          Trong Properties: Lần lượt chọn 2 Text File trên và chọn Embedded Resource trongBuild Action
–          Bây giờ chúng ta tiến hành chỉnh sủa class InstallerEngine:
using System;using System.Collections;using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.IO;
using System.Reflection;
using System.Data.SqlClient;
using System.Xml;
using System.Collections.Specialized;
namespace SetupEngine
{
[RunInstaller(true)]
public partial class InstallerEngine : System.Configuration.Install.Installer
{
private string logFilePath =””;
private string pathApp = “”;
public InstallerEngine()
{
InitializeComponent();
}
private string GetSql(string Name)
{
try
{
// Gets the current assembly.
Assembly Asm = Assembly.GetExecutingAssembly();
// Resources are named using a fully qualified name.
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + “.” + Name);
// Reads the contents of the embedded file.
StreamReader reader = new StreamReader(strm);
string sInfor = reader.ReadToEnd();
Log(sInfor);
reader.Close();
return sInfor;
}
catch (Exception ex)
{
Log(ex.ToString());
throw ex;
}
}
private void ExecuteSql(string serverName, string dbName, string userid, string password, string Sql)
{
string connStr = “server =” + serverName + “;database =” + dbName + “;uid=” + userid + “;pwd=” + password;
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
SqlCommand cmd = new SqlCommand(Sql);
conn.Open();
cmd.Connection = conn;
int n = cmd.ExecuteNonQuery();
Log(” n= ” + n);
conn.Close();
}
catch (Exception ex)
{
Log(ex.ToString());
}
}
}
protected void AddDBTable(string serverName, string userid, string password)
{
try
{
// Creates the database and installs the tables.
string strScript = GetSql(“sqldropcreate.txt”);
ExecuteSql(serverName, “master”, userid, password, strScript);
System.Threading.Thread.Sleep(60 * 1000);
strScript = GetSql(“sqldata.txt”);
ExecuteSql(serverName, “dbqlsv”, userid, password, strScript);
System.Threading.Thread.Sleep(60 * 1000);
string connStr = “server =” + serverName + “;database =dbqlsv;uid=” + userid + “;pwd=” + password;
Log(“AppPath=” + pathApp);
XmlDocument xmlDom = new XmlDocument();
xmlDom.Load(pathApp);
// Get XML node
XmlNode xmlNode = xmlDom.SelectSingleNode(
“configuration/appSettings/add[@key=’MYCONN’]”);
xmlNode.Attributes[“value”].Value = connStr;
// Updating connection string in file
Log(“Followind node of config file will be updated: ” + xmlNode.InnerXml);
// Save to disk
xmlDom.Save(pathApp);
}
catch (Exception ex)
{
//Reports any errors and abort.
Log(ex.ToString());
throw ex;
}
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string assemPath = this.Context.Parameters[“assemblypath”];
int pos = assemPath.LastIndexOf(“\\”);
logFilePath = assemPath .Substring(0,pos+1)+ “\\SetupLog117.txt”;
pathApp = assemPath.Substring(0, pos + 1) + “\\QLSVApplication.exe.config”;
Log(“—-Setup started—-“);
Log(“Server=” + this.Context.Parameters[“servername”] + ” ; User Id=” + this.Context.Parameters[“userid”] + ” ; pwd=” + this.Context.Parameters[“password”]);
foreach (DictionaryEntry s in this.Context.Parameters)
{
Log(“Parameter : “+s.Key +” ; value =”+s.Value);
}
AddDBTable(this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]);
}
public void Log(string str)
{
StreamWriter Tex;
try
{
Tex = File.AppendText(this.logFilePath);
Tex.WriteLine(DateTime.Now.ToString() + ” ” + str);
Tex.Close();
}
catch
{ }
}
}
}
Giải thích một số dòng lệnh bên trên:
Hàm GetSql(string Name) : Dùng để đọc 2 Text File Sql Script. Vì 2 tập tin này chúng ta nhúng vào Assembly nên cơ chế đọc tập tin sẽ là như vậy (xem code).
Lệnh : this.Context.Parameters[“assemblypath”]; lấy đúng đường dẫn mà lúc cài đặt chương trình người sử dụng chọn.
Key assemblypath là có sẵn, phải viết y chang.
this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]
còn servernam, userid, password là do chúng ta quy định, do chúng ta đặt bên Project Setup, 3 biến này phải đặt y chang như 3 biến mà bên Project Setup ta đã đặt.
void AddDBTable(string serverName, string userid, string password) có nhiệm vụ xóa và tạo mới  CSDL sau đó tạo các bảng, dữ liệu. sau khi tạo xong thì tự động cập nhập file App.config cho chương trình (dùng xml).
Bước 3: Tạo Project Setup
Chọn Setup project: đặt tên QLSVSetup rồi bấm OK.
Bấm chuột phải vào QLSVSetup/ chọn File System:
Tại cửa sổ này ta bấm chuột vào thư mục Application Folder, để có được thông tin như bên phải của hình ta làm như sau:
Bấm chuột phải vào Application Folder / Add/ Project Output…
Tiếp tục thêm các tập tin ứng dụng và app.config bên Project QLSVApplication vào đây:
Bấm chuột phải vào Application Folder / Add/ File:
Kết quả:
Để tạo Shortcut cho ứng dụng sau khi cài đặt thì ta bấm chuột phải vào QLSVApplication.exe
Sau đó cắt vào User’s Desktop hay User’s programs Menu, ta có thể tạo bất kỳ thư mục nào bên nhánh trái, rồi chép Shortcut vào đó, có thể tạo nhiều shortcut.
Tiếp theo ta cấu hình giao diện cài đặt, bấm chuột vào QLSVSetup, bên trên ta chọn Icon User Interface Editor:
Màn hình User interface sẽ xuất hiện:
Cửa sổ Add Dialog hiển thị lên:
Cấu hình  TextBoxes (A) như hình chụp bên dưới:
Các tên : CUSTOMTEXTA1, CUSTOMTEXTA2, CUSTOMTEXTA3 là do ta đặt để bên Custom Action có thể tham chiếu lấy giá trị từ màn hình cài đặt. Không dùng Edit4Property nên to cho Edit4Visible =false
–          Tiếp theo, cấu hình Custom Action: Bấm chuột phải vào QLSVSetup/ chọn View/ chọn Custom Actions
Tại cửa sổ Custom Actions, Bấm chuột phải vào Install / chọn Add Custom Action…
Chọn Primary ouput from SetupEngine (active) rồi bấm OK.
Sau đó click chuột vào Primary output, quan sát Properties, Ta cấu hình CustomActionData như hình:
/servername=[CUSTOMTEXTA1] /userid=[CUSTOMTEXTA2] /password=[CUSTOMTEXTA3]
Ta viết y chang như trên, chú ý là 3 biến servername, userid, password ta đặt bên này được sử dụng cho bên SetupEngine :
this.Context.Parameters[“servername”], this.Context.Parameters[“userid”], this.Context.Parameters[“password”]
Tức là ở đây ta đặt tên gì thì bên SetupEngine phải lấy đúng tên ta đặt bên này
CUSTOMTEXTA1 , CUSTOMTEXTA2, CUSTOMTEXTA3 là do ta đặt cho các EditPropertie của Textboxes (A)
Bước 4: biên dịch và cài đặt
–          Cấu hình QLSVSetup như bên dưới
Chọn Rebuild để biên dịch Setup.
Sau đó chọn Install để cài đặt:
Các bước cài đặt:
  1. BẤM next, tự động xuất hiện màn hình cấu hình CSDL (chính là Textboxes (A))
2. Nhập thông tin và bấm Next:
3. Chọn đường dẫn cài đặt và bấm Next … cứ vậy là xong. Chương trình sẽ cài đặt ứng dụng đồng thời cài đặt SQL luôn (có cập nhật kết nối cho ta luôn)
Kết quả quan sát màn hình Desktop và khởi động chương trình:

Tải tập tin hướng dẫn chi tiết tại đây : http://www.mediafire.com/view/?n3qjzbvthnt9q3n
Chúc các bạn thành công