C#winform打包安装数据库

【转】http://hi.baidu.com/goodphp/blog/item/4f769ac45838e8aa8226ac96.html

 

数据库的安装类,用到的cdatabase.txt,createtable.txt,insert.txt。将在以后贴上。

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Text;
using Microsoft.Win32;

namespace Newwms
{
    [RunInstaller(true)]
    public class Installer1 : System.Configuration.Install.Installer
    {
        private System.ComponentModel.IContainer components = null;
        string conStr = "packet size=4096;integrated security=SSPI;" +
            "data source=/"(local)/";persist security info=False;" +
            "initial catalog=master;connect timeout=30";
        public Installer1()
        {
            InitializeComponent();
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
        #region 重载自定义安装方法
        protected override void OnBeforeInstall(IDictionary savedState)
        {
            base.OnBeforeInstall(savedState);
        }
        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
            string databaseServer = Context.Parameters["server"].ToString();
            string userName = Context.Parameters["user"].ToString();
            string userPass = Context.Parameters["pwd"].ToString();
            string targetdir = this.Context.Parameters["targetdir"].ToString();

            conStr = GetLogin(databaseServer, userName, userPass, "master");
            SqlConnection sqlCon = new SqlConnection();

            try
            {

                sqlCon.ConnectionString = conStr;
                sqlCon.Open();

                //rijndael.GenKey();
                //rijndael.Encrypt(conStr);

                //stateSaver.Add("key", rijndael.Key);
                //stateSaver.Add("IV", rijndael.IV);
                //stateSaver.Add("conStr", rijndael.Encrypted);

                ExecuteSql(sqlCon, "cdatabase.txt");
                ExecuteSql(sqlCon, "createtable.txt");
                ExecuteSql(sqlCon, "insert.txt");


                //     DirectoryInfo dir = new DirectoryInfo(targetdir + @"/Data/Temp");
                //     string excSql = "";
                //     foreach(FileInfo f in dir.GetFiles("*.txt"))
                //     {  
                //      string table = f.Name.Remove(f.Name.IndexOf("."),4);
                //      excSql += "EXEC master..xp_cmdshell 'bcp ItemSoft.."+table+" in /""+f.FullName+"/" -c -t /"|/" -S "+databaseServer+" -U "+userName+" -P "+userPass+"'";
                //    
                //      ExecuteInitData(sqlCon,excSql);
                //     }
            }
            catch (SqlException)
            {
                MessageBox.Show("安装失败!/n数据库配置有误,请正确配置信息!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
                this.Rollback(stateSaver);
            }

            if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
            //SaveDataInfo(targetdir, databaseServer, userName, userPass);//保存数据库连接信息
            //RegInfo("Server");//保存安装日期

        }
        //protected override void OnAfterInstall(IDictionary savedState)
        //{
        //    base.OnAfterInstall(savedState);

        //    //注册报表组件
        //    string sysroot = System.Environment.SystemDirectory;
        //    System.Diagnostics.Process.Start("Regsvr32.exe", "-s " + sysroot + "//gregn3.dll");
        //    System.Diagnostics.Process.Start("Regsvr32.exe", "-s " + sysroot + "//grdes3.dll");

        //}
        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
        }
        //public override void Uninstall(IDictionary savedState)
        //{
        //    base.Uninstall(savedState);

        //    //    if(savedState.Contains("conStr"))
        //    //    {
        //    //     string targetdir = this.Context.Parameters["targetdir"].ToString();
        //    //     RijndaelCryptography rijndael = new RijndaelCryptography();
        //    //     rijndael.Key = (byte[])savedState["key"];
        //    //     rijndael.IV = (byte[])savedState["IV"];
        //    //     conStr = rijndael.Decrypt((byte[])savedState["conStr"]);
        //    //     SqlConnection sqlCon = new SqlConnection(conStr);
        //    //     ExecuteDrop(sqlCon);
        //    //    }
        //}
        #endregion

        #region 数据操作方法
        //从资源文件获取中数据执行脚本
        private static string GetScript(string name)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            Stream str = asm.GetManifestResourceStream(asm.GetName().Name + "." + name);
            StreamReader reader = new StreamReader(str, System.Text.Encoding.Default);
            System.Text.StringBuilder output = new System.Text.StringBuilder();
            string line = "";
            while ((line = reader.ReadLine()) != null)
            {
                output.Append(line + "/n");
            }
            return output.ToString();

            //    FileStream fs = new FileStream(name,FileMode.Open,FileAccess.Read);
            //    StreamReader sr = new StreamReader(fs,Encoding.Default);
            //    StringBuilder output = new StringBuilder();
            //    string rl;
            //    while((rl=sr.ReadLine())!=null)
            //    {
            //     output.Append(rl +"/n");
            //    }
            //    sr.Close();
            //    fs.Close();
            //    return output.ToString();

        }
        //获取数据库登录连接字符串
        private static string GetLogin(string databaseServer, string userName, string userPass, string database)
        {
            return @"server=" + databaseServer + ";database=" + database + ";User ID=" + userName + ";Password=" + userPass + ";connect timeout=300;";
        }
        private static void ExecuteSql(SqlConnection sqlCon, string sqlfile)
        {
            string[] SqlLine;
            Regex regex = new Regex("^GO", RegexOptions.IgnoreCase | RegexOptions.Multiline);

            string txtSQL = GetScript(sqlfile);
            SqlLine = regex.Split(txtSQL);

            if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
            sqlCon.Open();

            SqlCommand cmd = sqlCon.CreateCommand();
            cmd.Connection = sqlCon;

            foreach (string line in SqlLine)
            {
                if (line.Length > 0)
                {
                    cmd.CommandText = line;
                    cmd.CommandType = CommandType.Text;
                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        //rollback
                        string ss = ex.Message;
                        //ExecuteDrop(sqlCon);
                        break;
                    }
                }
            }
        }
        删除数据库
        //private static void ExecuteDrop(SqlConnection sqlCon)
        //{
        //    if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
        //    sqlCon.Open();
        //    SqlCommand cmd = sqlCon.CreateCommand();
        //    cmd.Connection = sqlCon;
        //    cmd.CommandText = GetScript("DropDatabase.txt");
        //    cmd.CommandType = CommandType.Text;
        //    cmd.ExecuteNonQuery();
        //    sqlCon.Close();
        //}

        #endregion

    }
}

以上参考于网络上的文章。以上是一个安装类的代码,要在用户界面上加文本框(A)

 

--------------------------------------------------cdatabase.txt,createtable.txt,insert.txt。

cdatabase.txt内容如下可将ckwms改为你的数据库名,语句的含义就是建数据库:

IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'ckwms')
BEGIN
CREATE DATABASE [ckwms]
exec sp_dboption N'ckwms', N'autoclose', N'false'

exec sp_dboption N'ckwms', N'bulkcopy', N'false'

exec sp_dboption N'ckwms', N'trunc. log', N'false'

exec sp_dboption N'ckwms', N'torn page detection', N'false'

exec sp_dboption N'ckwms', N'read only', N'false'

exec sp_dboption N'ckwms', N'dbo use', N'false'

exec sp_dboption N'ckwms', N'single', N'false'

exec sp_dboption N'ckwms', N'autoshrink', N'true'

exec sp_dboption N'ckwms', N'ANSI null default', N'false'

exec sp_dboption N'ckwms', N'recursive triggers', N'false'

exec sp_dboption N'ckwms', N'ANSI nulls', N'false'

exec sp_dboption N'ckwms', N'concat null yields null', N'false'

exec sp_dboption N'ckwms', N'cursor close on commit', N'false'

exec sp_dboption N'ckwms', N'default to local cursor', N'false'

exec sp_dboption N'ckwms', N'quoted identifier', N'false'

exec sp_dboption N'ckwms', N'ANSI warnings', N'false'

exec sp_dboption N'ckwms', N'auto create statistics', N'true'

exec sp_dboption N'ckwms', N'auto update statistics', N'true'

if( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) )
   exec sp_dboption N'ckwms', N'db chaining', N'false'

END

createtable.txt含义是建表:可在企业管理器里生成sql脚本。

use[ckwms]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[base_Oper]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[base_Oper]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ckDeposit]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ckDeposit]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ck_Invet]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ck_Invet]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ck_out]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ck_out]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[goods]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[goods]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tmpsearch]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tmpsearch]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[user]
GO

CREATE TABLE [dbo].[base_Oper] (
[id] [int] NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[code] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[parentcode] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ckDeposit] (
[Tnum] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[Resname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Resunit] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ResuNum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ResuPrice] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ResTime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ResLoca] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ResDur] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Resfrom] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Resperson] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Rmarks] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,
[Rallnum] [float] NULL ,
[id] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[ck_Invet] (
[Tnum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kunit] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[knum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kprice] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ktime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kloca] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kDur] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kform] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kperson] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[kallnum] [float] NULL ,
[kmarks] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[id] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ck_out] (
[Tnum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cunit] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cunum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cprice] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Rtime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cloca] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Ctime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cform] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Cperson] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[CDur] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Callnum] [float] NULL ,
[Cmark] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[id] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[goods] (
[id] [int] NOT NULL ,
[goodsname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[helpcode] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[parentcode] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tmpsearch] (
[code] [int] NULL ,
[goodsname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[bnum] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[user] (
[id] [int] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ,
[username] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[password] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_in] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_out] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_sys] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_sear] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_base] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_zy] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[have_manage] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

 

insert.txt含义是在表里加数据,在这里刚开始遇到点麻烦,差点功亏一篑,就是user是关键字必须要用[ ]括起来。还有就是一个字段被标识了就不需要赋值给它。

use ckwms

declare @count int
select @count = count(1) from base_Oper
if(@count<=0)
begin
insert into ckwms..base_Oper values('1','操作人员','czry','0');
insert into ckwms..base_Oper values('2','小王','xw','1');
end
GO

declare @count int
select @count = count(1) from [user]
if(@count<=0)
begin
insert into ckwms..[user] values('1','123','1','1','1','1','1','1','1');
end
GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值