Veritabanı oluştur butonuna kliklendiğinde çalışacak kodları yamaya başlıyoruz. Öncelikle veritabanını oluşturacak bir metot hazırlıyoruz.
SqlConnection cn;
void VeriTabaniOlustur()
{
string conStr = "server=" + txtServer.Text + ";uid=" + txtKullaniciAdi.Text + ";pwd=" + txtSifre.Text;
cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "USE [master];";
cmd.CommandText += "CREATE DATABASE [SetupDB] ON PRIMARY ";
cmd.CommandText += "( NAME = N'SetupDB', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\DATA\\SetupDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )";
cmd.CommandText += "LOG ON ";
cmd.CommandText += "( NAME = N'SetupDB_log', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\DATA\\SetupDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)";
cmd.CommandText += "COLLATE SQL_Latin1_General_CP1254_CI_AS ";
try
{
cn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
MessageBox.Show("Hata : \n" + ex.Message);
}
finally
{
cn.Close();
}
}
Daha sonra tablolarımızı oluşturacak bir metot hazırlıyoruz.
void TabloOlustur()
{
bool sonuc = true;
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
#region Urunler Tablosu
cmd.CommandText = "USE [SetupDB];";
cmd.CommandText+="CREATE TABLE [dbo].[Urunler](";
cmd.CommandText+="[UrunId] [int] IDENTITY(1,1) NOT NULL,";
cmd.CommandText+="[KategoriId] [int] NOT NULL,";
cmd.CommandText+="[UrunAdi] [nvarchar](50) COLLATE SQL_Latin1_General_CP1254_CI_AS NOT NULL,";
cmd.CommandText+="[BirimFiyat] [decimal](18, 2) NOT NULL,";
cmd.CommandText+="CONSTRAINT [PK_Urunler] PRIMARY KEY CLUSTERED (";
cmd.CommandText+="[UrunId] ASC";
cmd.CommandText+=")WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]";
cmd.CommandText+=") ON [PRIMARY]";
try
{
cn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
sonuc = false;
MessageBox.Show("Hata : \n" + ex.Message);
}
finally
{
cn.Close();
}
if (!sonuc)
return;
#endregion
#region Kategoriler Tablosu
cmd.CommandText = "USE [SetupDB];";
cmd.CommandText += "CREATE TABLE [dbo].[Kategoriler](";
cmd.CommandText += "[KategoriId] [int] IDENTITY(1,1) NOT NULL,";
cmd.CommandText += "[UstKategoriId] [int] NULL,";
cmd.CommandText += "[KategoriAdi] [nvarchar](50) COLLATE SQL_Latin1_General_CP1254_CI_AS NOT NULL,";
cmd.CommandText += "CONSTRAINT [PK_Kategoriler] PRIMARY KEY CLUSTERED (";
cmd.CommandText += "[KategoriId] ASC";
cmd.CommandText += ")WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]";
cmd.CommandText += ") ON [PRIMARY]";
try
{
cn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
sonuc = false;
MessageBox.Show("Hata : \n" + ex.Message);
}
finally
{
cn.Close();
}
if (!sonuc)
return;
#endregion
}
Bu adımdan sonra kalan tek şey button1 e kliklenince bu iki metotu tetiklemek
private void button1_Click(object sender, EventArgs e)
{
VeriTabaniOlustur();
TabloOlustur();
}
Artık sıra geldi bu formu ekrana getirecek olan Installer sınıfına. Öncelikle class library projemize System.Configuration.Install namespace ini refere ediyoruz. Böylece System.Configuration.Install.Installer sınıfını kullanabilir hale geliyoruz. Bu sınıf Setup projelerinde
- Install
- Commit
- Rollback
- Uninstall
aşamalarında çalışarak istediğiniz her türlü işlemi yaptırabileceğiniz bir sınıf olmakla beraber kendisinden türeyen sınıflara 5 adet virtual metot sunmaktadır. Bunlar :
- public virtual void Commit(IDictionary savedState);
- public virtual void Install(IDictionary stateSaver);
- public virtual void Rollback(IDictionary savedState);
- public virtual void Uninstall(IDictionary savedState);
Bu metotlar ile kurulum işleminin herhangi bir aşamasına ulaşığ istediğiniz program çalıştırabilir veya istediğiniz komutları işletebilirsiniz.
Class Library projesinde yapılması gereken en son adım class a RunInstaller Attribute bildirme işlemidir.
Class ın son görüntüsü aşağıdaki gibidir:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace SetupDBKurulum
{
[System.ComponentModel.RunInstaller(true)]
public class Kurucu:System.Configuration.Install.Installer
{
public override void Install(System.Collections.IDictionary stateSaver)
{
frmBilgi frm = new frmBilgi();
frm.ShowDialog();
base.Install(stateSaver);
}
}
}
Son olarak setup paketimize class library projemizin çıktısını project output olarak ekliyoruz.
Artık setup projemizde iki adet program çıktısı bulunmakta.
Bir tanesi PaketProgramWin.exe, diğeri ise SetupDBKurulum.dll
Şimdi setup projemizde Solution Explorer üzerinde bulunan custom actions editor e geliyoruz.
Bu editör içerisinde Install aşamasına sağ klik ve Add Custom Action diyoruz. Karşımıza gelen pencerede Application Folder altında bulunan SetupDBKurulum isimli proje çıktısını seçip Ok diyoruz, böylece kurulum yapılırken Install aşamasının sonuna doğru bilgi formumuz ekrana gelecek ve veritabanı kurulacaktır.
Not : Bu işlemi yaptıktan sonra mutlaka Setup projenize Rebuild işlemini uygulayınız
Not : Install denemelerinizi her zaman solution explorer üzerinde setup projesine sağ klik yaparak Install seçeneği ile yapınız.
Yaptığımız Install Denemesinde göreceğiz ki Install aşaması tamamlanmadan hemen önce karşımıza tasarladığımız form çıkmakta ve DB kurulumunu yapmakta.
Böylece hazırladığınız paket programlar için veritabanını nasıl göndereceğim problemini çözmüş oluyoruz.
Bir sonraki makalede görüşmek üzere herkese iyi çalışmalar
Bora BURGUCUGİL
bora.burgucugil@bilgeadam.com
BilgeAdam BTA Beşiktaş
Microsoft Certified Trainer