我的做法,仅供参考:
一般是自己做一个数据库的初始化程序(该程序随安装包分发),在程序里建立数据库,创建表、存储过程等对象,并Insert一些初始数据。

解决方案 »

  1.   

    http://www.aspxcn.com/dotnetarticle/html/131.html
      

  2.   

    安装数据库。转 
    由于主要是参考MSDN的,所以这里一些细节不再重复 
    具体大家可以参考MSDN上一篇叫: 
    Walkthrough: Using a Custom Action to Create a Database During Installation 
    的文章。拷贝下来的,地址不知道了,不好意思:) 
    下面开始说制作的步骤: 
    首先:新建一个类库,以C#为例。命名随意 
    然后添加新项,选择安装程序类,命名也随意 
    然后添加一个名为:sql.txt的文件(注意大小写)点击sql.txt右键,在生成操作中选择嵌入的资源。 
    sql.txt的内容为从sql server数据库导出的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# 执行,也不会报错:)(困扰了我很久,呵呵) 回到安装文件类的视图页面,点击数据库资源管理器,选择master数据库生成一个sqlconnection。这个细节我就不重复了。(注意一点,验证使用window集成) 切换到安装类到代码视图 
    引入名字空间: 
    using System.Reflection; 
    using System.IO; 
    然后添加以下几个函数,等下一一介绍: 
            private  string 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函数: 
    他的作用是把sql.txt(作为参数)的sql语句一行一行读出来,但是要注意一点: 
    和MSDN不同的,如果有中文的话,一定要加上 
    StreamReader reader = new StreamReader(strm,System.Text.Encoding.Default);  
    而不是MSDN的StreamReader reader = new StreamReader(strm);  
    否则中文全部是乱码:( ExecuteSql是一个通用函数,方便以后调用 程序的精髓在AddDBTable这个函数上面,也是困扰我最久的一个函数: 
    首先, 
    ExecuteSql("master","CREATE DATABASE "+ strDBName);  
    创建一个数据库,strDBName为传入参数,以后介绍。 
    ExecuteSql(strDBName,GetSql("sql.txt"));  
    调用GetSql函数,读sql.txt内容,并执行。 
    由于安装之后要与.net系统融合,所以下面执行的sp是一个具体的情况。 
    首先,我的系统在web.config里使用的是mymoamaster用户,密码也为myoamaster,这样可以避免sa密码对于每个用户不同这个问题。 ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");  这个sp的主要作用是为新数据库创建一个登录 
    ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");  这个语句的作用的为刚才这个登录指定数据库访问权限 
    ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");  这个sp的作用是指定myoamaster有db_owner的权限 PS:这几个sp的具体详细功能大家可以参考sql server的联机帮助。 
    完成了上面的东西后,万里长城就剩下一点点了。呵呵:) 首先,添加一个新项目(废话,当然是安装项目了,呵呵)命名也随意,选择应用程序文件夹,右键添加点击项目输出,,选择主输出。 
    右键安装项目,视图,用户界面,添加文本框A,作用是给你创建的数据库命名。对话框的文字就随意改了,Edit1Porperty改成和MSDN上一样的CUSTOMTEXTA1(这个我也不知道是不是一定要这样,还没有时间测试)然后把Edit2,3,4都隐藏掉。 
    右键安装项目选择视图点击自定义操作 ,选中安装结点,单击添加双击应用程序文件夹在主输出来自...(活动)上右键属性CustomActiveData属性修改为/dbname=[CUSTOMTEXTA1](这个相信你也看出来了,在上面那几个函数里使用的strDBName就是这个了。呵呵 然后编译执行。是不是很酷呢。呵呵 
      

  3.   

    有个问题,我按照上面的方法,测试成功
    可是这个安装程序却在我的硬盘里复制了
    很多DLL文件,不知你们是不是这样?
      

  4.   

    写成.bat文件。
    osql.exe –E –d SessionDemoDb –i Session.sql-d为你的数据库名,如果你在session.sql里面写了Create Database SessionDemoDb()这后,就不需要这个-d SessionDemoDb语句了。