【转】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