.NET 플랫폼에서는 웹 솔루션을 배포하는 것이 더 편리합니다. Visual Studio.NET 2003을 사용하여 WEB 설치 프로젝트를 추가하고 배포된 "파일 시스템 편집기"에 프로젝트의 기본 출력 및 콘텐츠 파일을 추가하고 설치 프로그램을 매우 쉽게 완료할 수 있습니다.
그러나 이런 방식으로 작성된 설치 프로그램은 웹 페이지와 ASP.NET 프로그램으로 컴파일된 DLL 파일만 대상 시스템의 IIS 디렉터리에 설치합니다. ) 데이터베이스가 SQL SERVER인 경우 배포 중에 데이터베이스를 설치해야 하며 설치 프로그램이 더 복잡해지며 설치 프로그램 클래스를 사용자 정의해야 합니다. 설치 관리자 클래스에서 SQL 스크립트를 실행하고 연결 문자열을 Web.config에 씁니다.
l 데이터베이스 설치
Microsoft MSDN에서는 응용 프로그램을 배포할 때 데이터베이스를 설정하는 방법을 소개합니다. 예:
이 방법은 설치 프로그램 클래스를 생성하고 설치 프로그램 클래스에서 호출하는 것입니다. ADO.NET은 SQL 문(SQL 문은 텍스트 파일에 위치)을 실행하여 데이터베이스를 생성합니다.
그러나 이 방법에는 문제가 있습니다. SQL Server2000을 사용하여 모든 테이블, 뷰 및 저장 프로시저에 대한 스크립트 파일을 생성하고 ADO.NET을 사용하여 이 스크립트 파일을 실행하면 "GO" 문이 많이 발생합니다. 스크립트에 오류가 발생했습니다. 물론 "GO"를 개행 문자로 바꾸고 ADO.NET을 사용하여 SQL 문을 하나씩 실행할 수 있습니다. 분명히 이 효율성은 상대적으로 낮습니다.
가장 좋은 방법은 osql을 호출하여 스크립트를 실행하는 것입니다. (또는 데이터베이스 프로젝트에 대한 cmd 파일을 생성하고, cmd 파일은 데이터베이스 생성 시 osql도 호출합니다.)
시스템 사용;
System.Collections 사용;
System.ComponentModel 사용;
System.Configuration.Install 사용;
System.Data.SqlClient 사용;
System.IO 사용;
System.Reflection 사용;
System.Diagnostics 사용;
System.Xml
네임스페이스 DBCustomAction
사용
{
/// <요약>
/// DBCustomAction에 대한 요약 설명입니다.
/// </summary>
[설치 프로그램 실행(true)]
공개 클래스 DBCustomAction : System.Configuration.Install.Installer
{
/// <요약>
///@작성자:과장됨
/// </summary>
개인 System.ComponentModel.Container 구성 요소 =
공용 DBCustomAction()
{
// 이 호출은 디자이너에 의해 요구됩니다.
초기화구성요소();
// TODO: 초기화구성요소가 호출된 후 초기화를 추가합니다.
}
/// <요약>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
보호된 재정의 void Dispose(bool disposing)
{
만약(처분)
{
if(구성 요소 != null)
{
구성요소.Dispose();
}
}
base.Dispose( 처분 );
}
#region 구성요소 디자이너가 생성한 코드
/// <요약>
/// 디자이너는 필수 메서드를 지원합니다. 코드 편집기를 사용하여 수정하지 마세요.
/// 이 메소드의 내용입니다.
/// </summary>
개인 무효 초기화 구성 요소()
{
구성 요소 = 새로운 System.ComponentModel.Container();
}
#endregion
#region 맞춤 설정
개인 무효 ExecuteSql(문자열 connString, 문자열 DatabaseName, 문자열 sql)
{
SqlConnection conn=new SqlConnection(connString);
SqlCommand cmd=new SqlCommand(sql,conn);
conn.Open();
cmd.Connection.ChangeDatabase(데이터베이스이름);
노력하다
{
cmd.ExecuteNonQuery();
}
잡기(예외 e)
{
StreamWriter w=new StreamWriter(@"e:\log.txt",true);
w.WriteLine("===ExecuteSql======");
w.WriteLine(e.ToString());
w.닫기();
}
마지막으로
{
conn.Close();
}
}
공개 재정의 무효 설치(IDictionary stateSaver)
{
createDB();
업데이트구성();
}
개인 무효 createDB()
{
노력하다
{
문자열 connString=string.Format("서버={0};사용자 ID={1};비밀번호={2}",this.Context.Parameters["서버"],this.Context.Parameters["사용자"], this.Context.Parameters["pwd"]);
//입력된 데이터베이스 이름을 기반으로 데이터베이스를 생성합니다.
ExecuteSql(connString,"master","create 데이터베이스 "+this.Context.Parameters["dbname"])
//osql을 호출하여 스크립트 실행
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["서버"],this .Context.Parameters["user"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
System.Diagnostics.Process sqlProcess=새 프로세스();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Arguments=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlProcess.Start();
sqlProcess.WaitForExit();//실행을 기다리는 중
sqlProcess.Close();
//스크립트 파일 삭제
System.IO.FileInfo sqlFileInfo=new FileInfo(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
if(sqlFileInfo.Exists)
sqlFileInfo.Delete();
}
잡기(예외 e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===설치 중======");
w.WriteLine(e.ToString());
w.닫기();
}
}
개인 무효 updateConfig()
{
노력하다
{
//Web.config에 연결 문자열을 씁니다.
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]))
if(!fileInfo.Exists)
throw new InstallException("web.config를 찾을 수 없습니다.");
XmlDocument doc=new XmlDocument();
doc.Load(fileInfo.FullName);
boolfoundIt=false;
문자열 connString=string.Format("서버={0};데이터베이스={1};사용자 ID={2};password={3}",this.Context.Parameters["서버"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
string enCS=SecurityHelper.EncryptDBConnectionString(connString)
XmlNode no=doc.SelectSingleNode ("//appSettings/add[@key='connString']");
if(아니요!=null)
{
no.Attributes.GetNamedItem("value").Value=enCS;
발견=true;
}
if(!foundIt)
throw new InstallException("connString 설정을 찾을 수 없습니다. ");
doc.Save(fileInfo.FullName);
}
잡기(예외e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===업데이트 connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.닫기();
}
}
#끝지역
}
}