Makale Özeti

Bu makalemizde geliştirdiğimiz uygulamamızın müşterilerimize veya farklı lokasyonlara kurulumu sırasında "nasıl olacak" sorusuyla kafamızı karıştıran bir sorunun cevabına yani program kurulumundan önce SQL Server üzerinde veritabanımızı kurmaya değiniyor olacağız.

Makale

Installer Class Kullanimi

Bu makalemizde geliştirdiğimiz uygulamamızın müşterilerimize veya farklı lokasyonlara kurulumu sırasında ?nasıl olacak?? sorusuyla kafamızı karıştıran bir sorunun cevabına yani program kurulumundan önce SQL Server üzerinde veritabanımızı kurmaya değiniyor olacağız.

Visual Studio 2005 ile birlikte çok başarılı ve yetenekli olan setup projelerimize Installer Class dediğimiz sınıflar sayesinde istediğiniz her işlemi yaptırabilirsiniz. Konuyu biraz daha açarak ilerleyelim. Kurulum sırasında veritabanının otomatik olarak kurulması işlemi sanırım hepimiz için yeterince önemlidir J. Makalemizde bu kurulum işlemini veritabanımızın scriptini çıkartarak, yazacağımız bir class library ile çözeceğiz.Yani kurulum sırasında kendi yazdığımız bir windows formunu ekrana getirecek ve kullanımızdan server bilgilerini alacağız, sonrasında ise scriptleri çalıştırarak veritabanını oluşturacağız.

Bu kadar konuşmadan sonra makalemizin içeriğine geçelim. Veritabanımız aşağıdaki gibidir.

 

USE [master]

GO

CREATE DATABASE [SetupDB] ON  PRIMARY

( NAME = N'SetupDB', FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\DATA\\SetupDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

 LOG ON

( 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%)

 COLLATE SQL_Latin1_General_CP1254_CI_AS

GO

 

Tablolarımız :

*Ürünler Tablosu*

USE [SetupDB]

GO

CREATE TABLE [dbo].[Urunler](

      [UrunId] [int] IDENTITY(1,1) NOT NULL,

      [KategoriId] [int] NOT NULL,

      [UrunAdi] [nvarchar](50) COLLATE SQL_Latin1_General_CP1254_CI_AS NOT NULL,

      [BirimFiyat] [decimal](18, 2) NOT NULL,

 CONSTRAINT [PK_Urunler] PRIMARY KEY CLUSTERED

(

      [UrunId] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

*Kategoriler Tablosu*

USE [SetupDB]

GO

CREATE TABLE [dbo].[Kategoriler](

      [KategoriId] [int] IDENTITY(1,1) NOT NULL,

      [UstKategoriId] [int] NULL,

      [KategoriAdi] [nvarchar](50) COLLATE SQL_Latin1_General_CP1254_CI_AS NOT NULL,

 CONSTRAINT [PK_Kategoriler] PRIMARY KEY CLUSTERED

(

      [KategoriId] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

 

GO

                Veritabanımızın kodlarını oluşturduktan sonra artık kodlarımıza geçebiliriz.

Not : Bu makalede anlatilan konu installer class ile veritabanı kurulumu olduğundan dolayı kurulumu yapılacak olan windows application içerisinde sadece basit bir mesaj verilmektedir.

      Visual Studio içerisinden yeni bir blank solution açıyoruz, ismine ise SetupMakale adını verelim.

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image001.jpg

 

      Daha sonra bu çözüm içerisine bir windows application ekleyeceğiz. Ismini ?PaketProgramWin? olarak belirleyelim.Windows application içerisinde bir buton yerleştirip Click olayında ise basit bir mesaj çıkartalım.

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image002.jpg

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image003.jpg

Artık setup projemize geçebiliriz.Solution içerisine yeni bir proje daha ekleyeceğiz fakat bu sefer proje şablonu olarak Setup Project seçeceğiz.

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image004.jpg

Bu projemizde Installer class kullanımını inceleyeceğiz. Setup projelerinin detaylı kullanımına aşağıdaki linkten erişebilirsiniz.

http://www.yazilimuzmani.com/Articles/Details.aspx?aId=1000000417

Setup programımızı oluşturduktan sonra sıra windows projemizi yani hedef makinede çalışacak olan programımızın çıktısını setup projemize dahil etmeye geldi. Bu işlemi yapabilmek için Solution Explorer içerisinde Setup projeniz üzerinden Add à Project Output seçeneğini seçip karşımıza gelen ekrandan PaketProgramWin projemisinin Primary Output yani çıktısını setup paketimize dahil ediyoruz.

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image005.jpg

 

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image006.jpg

 

Bu işlemi yaptıktan sonra setup projemiz kuruluma hazır ama bizim istediğimiz şekilde değil. J Bu adımdan sonra veritabanımızı kuracak olan Class Library projemize geçiyoruz. Aynı solution içerisine yeni bir proje daha ekleyeceğiz. Bu sefer Class Library projesini seçip ismine SetupDBKurulum adını verelim.

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image007.jpg

Class library projemize öncelikle bir referans vermemiz gerekiyor, bunun için class library System.Windows.Forms namespace?ini referans veriyoruz. Daha sonra library projemize yeni bir windows formu ekliyoruz. Formun görüntüsü aşağıdadır :

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image008.jpg

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.

 

http://www.boraburgucugil.com/images/Makaleler/c99487ad-b1c8-40a8-ad84-8b48ceb61da4//Makaleler/Resimler/1000001828_image009.jpg

 

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