明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

數(shù)據(jù)庫安裝包的制作(參考MSDN)

[摘要]由于主要是參考MSDN的,所以這里一些細節(jié)不再重復具體大家可以參考MSDN上一篇叫:Walkthrough: Using a Custom Action to Create a Database D...
由于主要是參考MSDN的,所以這里一些細節(jié)不再重復
具體大家可以參考MSDN上一篇叫:
Walkthrough: Using a Custom Action to Create a Database During Installation
的文章。拷貝下來的,地址不知道了,不好意思:)
下面開始說制作的步驟:
首先:新建一個類庫,以C#為例。命名隨意
然后添加新項,選擇安裝程序類,命名也隨意
然后添加一個名為:sql.txt的文件(注意大小寫)點擊sql.txt右鍵,在生成操作中選擇嵌入的資源。
sql.txt的內容為從sql server數(shù)據(jù)庫導出的sql語句
這里有個地方需要注意:
一般導出的sql格式是這樣的:
CREATE TABLE [dbo].[Company_CanidateAlertList] (
[JobID] [int] NULL ,
[JobSeekerID] [int] NULL ,
[SYS_CreateTime] [datetime] NULL
) ON [PRIMARY]
GO

這時你需要改成:
CREATE TABLE [dbo].[Company_CanidateAlertList] (
[JobID] [int] NULL ,
[JobSeekerID] [int] NULL ,
[SYS_CreateTime] [datetime] NULL
) ON [PRIMARY];
否則不會被C# 執(zhí)行,也不會報錯:)(困擾了我很久,呵呵)

回到安裝文件類的視圖頁面,點擊數(shù)據(jù)庫資源管理器,選擇master數(shù)據(jù)庫生成一個sqlconnection。這個細節(jié)我就不重復了。(注意一點,驗證使用window集成)

切換到安裝類到代碼視圖
引入名字空間:
using System.Reflection;
using System.IO;
然后添加以下幾個函數(shù),等下一一介紹:
privatestring GetSql(string Name)
{
try
{
Assembly Asm = Assembly.GetExecutingAssembly();
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "."+Name);
StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);
//System.Text.Encoding.ASCII;
return reader.ReadToEnd();

}
catch (Exception ex)
{
Console.Write("In GetSql:"+ex.Message);
throw ex;
}
}

private void ExecuteSql(string DataBaseName,string Sql)
{
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConnection1);

Command.Connection.Open();
Command.Connection.ChangeDatabase(DataBaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
Command.Connection.Close();
}
}


protected void AddDBTable(string strDBName)
{
try
{
ExecuteSql("master","CREATE DATABASE "+ strDBName);
ExecuteSql(strDBName,GetSql("sql.txt"));
ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");
ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");
}
catch(Exception ex)
{
Console.Write("In exception handler :"+ex.Message);
}
}

public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
AddDBTable(this.Context.Parameters["dbname"]);
}

首先介紹GetSql函數(shù):
他的作用是把sql.txt(作為參數(shù))的sql語句一行一行讀出來,但是要注意一點:
和MSDN不同的,如果有中文的話,一定要加上
StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);
而不是MSDN的StreamReader reader = new StreamReader(strm);
否則中文全部是亂碼:(

ExecuteSql是一個通用函數(shù),方便以后調用

程序的精髓在AddDBTable這個函數(shù)上面,也是困擾我最久的一個函數(shù):
首先,
ExecuteSql("master","CREATE DATABASE "+ strDBName);
創(chuàng)建一個數(shù)據(jù)庫,strDBName為傳入?yún)?shù),以后介紹。
ExecuteSql(strDBName,GetSql("sql.txt"));
調用GetSql函數(shù),讀sql.txt內容,并執(zhí)行。
由于安裝之后要與.net系統(tǒng)融合,所以下面執(zhí)行的sp是一個具體的情況。
首先,我的系統(tǒng)在web.config里使用的是mymoamaster用戶,密碼也為myoamaster,這樣可以避免sa密碼對于每個用戶不同這個問題。

ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");這個sp的主要作用是為新數(shù)據(jù)庫創(chuàng)建一個登錄
ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");這個語句的作用的為剛才這個登錄指定數(shù)據(jù)庫訪問權限
ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");這個sp的作用是指定myoamaster有db_owner的權限

PS:這幾個sp的具體詳細功能大家可以參考sql server的聯(lián)機幫助。
完成了上面的東西后,萬里長城就剩下一點點了。呵呵:)

首先,添加一個新項目(廢話,當然是安裝項目了,呵呵)命名也隨意,選擇應用程序文件夾,右鍵添加點擊項目輸出,,選擇主輸出。
右鍵安裝項目,視圖,用戶界面,添加文本框A,作用是給你創(chuàng)建的數(shù)據(jù)庫命名。對話框的文字就隨意改了,Edit1Porperty改成和MSDN上一樣的CUSTOMTEXTA1(這個我也不知道是不是一定要這樣,還沒有時間測試)然后把Edit2,3,4都隱藏掉。
右鍵安裝項目選擇視圖點擊自定義操作 ,選中安裝結點,單擊添加雙擊應用程序文件夾在主輸出來自...(活動)上右鍵屬性CustomActiveData屬性修改為/dbname=[CUSTOMTEXTA1](這個相信你也看出來了,在上面那幾個函數(shù)里使用的strDBName就是這個了。呵呵

然后編譯執(zhí)行。是不是很酷呢。呵呵


PS:好久沒有寫過東西了,寫得不好,希望大家不要介意。有什么疑問或者可以改進的地方希望大家提出。
特別感謝:ZEE,CNet,amjn等其他一些大俠對我提供的幫助。再次感謝。使得我的項目順利完成。

貼這些出來,希望對新手有用,至于高手,就隨便看看好了。呵呵:)