C sharpta SQL Veritabanı Da İçeren Program Setup' ı Oluşturma

Visual Studio’ da C sharp ile bir veritabanı projesi yaptınız. Bu projenin başka bilgisayarlarda çalışabilmesi için veritabanının da setup içerisinde gömülü olması gerekir. Peki bir projenin setup’ ı nasıl oluşturulur? SQL veritabanı bu setup içine nasıl gömülür? Bu soruların cevaplarını resimli anlatımlarla, yazının devamında bulabilirsiniz.

Öncelikle basit bir veritabanı programı hazırlayarak işe başlayalım. Program, genel olarak  bir datagrid içeriyor ve veritabanındaki bilgileri, butonun “click event” inde datagride aktarıyor. Makale konusunun dışına çıkmamak için kod ayrıntılarına girmeyeceğim.

NOT: İlerde kullanılacak bazı sınıflar için formu içeren class içine şu namespace’ ler eklenmelidir.

using System.Diagnostics;   //Process sınıfı için eklediğim namespace

using Microsoft.Win32;      //Registry sınıfı için eklediğim namespace

[cc lang='csharp' ]
private void button1_Click(object sender, EventArgs e)
{
    select();
}       

private void select()
{
    string connStr = @"Data Source=SEREF-PC\SQLEXPRESS;Initial Catalog=deneme;Integrated Security=True";
    SqlConnection conn = new SqlConnection(connStr);
    conn.Open();
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM tbl_temelBilgiler", conn);
            
    // DataSet nesnesi oluştur
    DataSet ds = new DataSet();
            
    //DataSet' i doldur
    adapter.Fill(ds, "MyTable");
            
    // this.dataGrid1.SetDataBinding(ds,"MyTable"); ya da
    this.dataGrid1.DataSource = ds.DefaultViewManager;
}
[/cc]

Projeye Bir Setup Projesi Eklemek

Projenin bir setup’ ını oluşturmak için öncelikle projeye bir setup projesi eklemeliyiz. Solution Explorer penceresinde -Solution ‘ProjeAdi’- üzerinde sağ tıklayıp add–>new Project Yolu ile karşımıza aşağıdaki ekran geliyor:

Other Project Types –> Setup and Deployment –> Visual Studio Installer yolu ile sağdan çıkan simgelerden Setup Project‘ e tıklayıp ismini veriyoruz. Location kısmının da Projemizin yolunu gösterdiğinden emin olduktan sonra ok tuşuna basıp yeni Setup Projesini oluşturuyoruz. Projeye File System(Setup2) adında yeni bir sayfanın açıldığını göreceksiniz. İşte bu sayfa gerekli ayarlamaların yapılacağı sayfadır. Buradan, kurulumun yapılacağı yerde oluşturulacak klasörün görünümü ayarlanabilir.

Proje exe Dosyasını Setup Projesine Eklemek

(Aşağıdaki resim)File System (Setup2) penceresindeki “Application Folder” klasörüne sağ tık  –> Add –> Project Output yolu ile açılan pencereden Primary output seçeneğini seçip, Configuration ayarını da (Active) yaptıktan sonra Ok tuşuna basıyoruz. Primary output seçeneğini seçmemizin sebebi, bu seçenekle birlikte debug klasöründeki proje exe dosyasının setup projesine dahil edilmesidir.

Setup iconu Eklemek

(Yukardaki resim) Yine File System (Setup2) penceresindeki “Application Folder” klasörüne sağ tık  –> Add –> File yolu ile projeye, setup dosyasında kullanılmak üzere bir ico dosyası yüklüyoruz. Setup oluşturmak için Application Folder ile yapacaklarımız bu kadar. Setup projesinin son şeklinde, sağ tarafta eklenen nesnelerin görünmesi gerekiyor. (Aşağıdaki resim)

Program Kısayol Simgesinin Konumunu Belirlemek

İkinci aşamada ise kurulum sırasında masaüstüne oluşturulmasını istediğimiz kısayol simgesinin ayarlarını yapacağız. File System(Setup2) penceresindeki “User’s Desktop” klasörüne tıkladıktan sonra sağdaki boş bölmede sağ tuşa tıklayıp –> Create New Shortcut yolu izlendiğinde açılan pencereden (Aşağıdaki resim) kısayol simgesinin temsil ettiği yani programın kurulu olduğu dosyayı işaret edecek olan dosyayı seçiyoruz. Bu dosya, yukarda belirttiğimiz “Primary Output” dosyasıdır. Aşağıdaki pencereden bu dosyayı seçip Ok tuşuna basıyoruz.

Masaüstü Kısayol Simgesini Belirlemek

Masaüstüne oluşturulan kısayol simgesinin de tabi ki bir icon olması gerekiyor. Bu adımda da bu icon’ u belirleyeceğiz. Bir adım önce eklediğimiz hedef dosyaya tıklıyoruz. Proporties penceresinden bu dosyanın icon özelliğine tıklayıp browse sekmesini seçtiğimizde karşımıza aşağıdaki pencere geliyor. Buradan da yukarda eklediğimiz, Application Folder altındaki ico dosyasını seçip Ok tuşuna tıklayarak kısayolun alacağı resmi belirlemiş oluyoruz.

Programın, Başlat–>Programlar Menüsünde Görünmesini Sağlamak

Eğer programınızın Başlat –> Programlar menüsünde görünmesini istiyorsanız bu adımı uygulamanız gerekiyor. File System(Setup2) penceresindeki “User’ s Programs Menu” klasörüne sağ tıklayıp–> Add –> Folder yolu ile bir klasör ekleyelim. Benim klasör ismim “Database Project“. Oluşturulan bu klasöre tıkladıktan sonra sağdaki boş bölmede sağ tuşa tıklayıp –> Create New Shortcut yolu izlendiğinde açılan pencereden kısayol simgesinin temsil ettiği yani programın kurulu olduğu dosyayı işaret edecek olan dosyayı seçiyoruz. Bu dosya, yukarda belirttiğimiz “Primary Output” dosyasıdır. Aşağıdaki pencereden bu dosyayı seçip Ok tuşuna basıyoruz. Bu aşamayı da bitirdikten sonra son görüntü aşağıdaki gibi olmalı.

Yine buradaki kısayolun simgesini değiştirmek için de sağdaki kısayol seçili iken proporties penceresindeki icon özelliğine “Application Folder”daki ico dosyasını atayabilirsiniz.

Proje Genel Ayarlarını Düzenleme

Projenin kurulum aşamasında kullanacağı ayarlardır bunlar. Projenin sahibi, versiyonu vb özellikler buradan ayarlanabilir. Bu ayarları değiştirmek için; Setup1 projesi seçili iken properties penceresindeki özellikleri değiştirmeliyiz.

 SQL Server Express Sürümünü Setup’ a Eklemek

Öncelikle projeye bir Class Library ekleyelim. Class Library ile amacımız, SQL Server Express Sürümünün kurulum dosyasının, programın kurulumu esnasında bilgisayara kopyalanmak olacaktır. Şimdi Class Library nasıl eklenir buna bakalım. Solution üzerinde Add –> New Project –> Visual C# yolu ile sağ bölmede gelen nesnelerden Class Library seçeneğini seçtikten sonra adını da “copySQL” olarak değiştirelim. Ardından eklediğimiz copySQL projesine sağ tıklayıp, setupSQL adında, SQLEXPRESS‘ in kurulumunu koyacağımız bir klasör oluşturalım. Klasör üzerinde sağ tıklayıp Add –> Existing İtem seçeneği ile https://www.microsoft.com/betaexperience/pd/SQLEXPDB64/enus/ indirdiğiniz SQL Server Express kurulumunu klasör içine ekliyoruz. Ardından SQLEXPR_x64_ENU.exe seçili iken Build Action özelliğini Embedded Resource yapıyoruz. (Aşağıdaki resim) Bu sayede, SQLEXPR_x64_ENU.exe dosyası Class Library projesinin(copySQL) dll’ine dahil edilmiş oluyor.

Bu aşamadan sonra amacımız, kurulum esnasında bu SQL installer dosyasını bilgisayar kopyalamak olacaktır. Kurulum esnasında bilgisayar dosya kopyalama işlemlerini gerçekleştiren nesne, InstallerClass‘ dır. Bu classı projeye eklemek için, copySQL projesi üzerinde sağ tık –> Add –> New Item –> Visual C# Items kategorisi altından sağ bölmeden Installer Class seçeneğini seçip adını da “instClssCopySQL” yaparak Ok tuşuna tıklıyoruz. Karşımıza gelen instClssCopySQL classı içine aşağıdaki kodları yazarak SQL Server’ ı belgelerim dizinine kaydedecek kodu tamamlamış olacağız.

[cc lang='csharp' ]
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.IO;            // FileStream, Stream ve FileMode sınıfları için eklenmesi gereken namespace
using System.Reflection;    //Assembly sınıfı için gerekli namespace


namespace setSQL
{
    [RunInstaller(true)]
    public partial class instClssCopySQL : System.Configuration.Install.Installer
    {
        //Kullanıcının bilgisayarının Belgelerim klasöründe yükleyeceğim SQLEXPR.exe dosyasının yolu tanımlanıyor.
        public static readonly string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\SQLEXPR_x64_ENU.exe";

        //Kopyalama işlemi yapılıyor.
        public instClssCopySQL()
        {
            InitializeComponent();
            //yazılacak stream tanımla
            FileStream fileStream = new FileStream(path, FileMode.Create);
            //CopySQL projesi içerinde dll'e gömdüğümüz kopyalanacak nesneye ulaşmak için projeAdi.klasör.dosya yolunu kullanıyoruz.
            Stream readStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("setSQL.setupSQL.SQLEXPR_x64_ENU.exe");
            //Böylece Assebmbly içerisine gömülen kurulum dosyamız tekrar kullanıcın Belgelerim klasörü içerinde fiziksel olarak oluşturulmaktadır.
            CopyStream(readStream, fileStream);
        }

        void CopyStream(Stream readStream,Stream writeStream)
        {
            //readStream nesnesi writeStream nesnesine byte'lar halinde kopyalanacaktır.Bu amaçla buffer dizisi tanımlanmıştır.
            byte[] buffer = new byte[256];  
            //readStream nesnesinden her seferde 256 byte okunarak buffer dizine atılmaya çalışılmaktadır.
            int bufferLength = readStream.Read(buffer, 0, 256);
            //buferLength>0 yani Steram'de hala okunacak byte varsa okumaya devam et
            while (bufferLength > 0)
            {
                //okunan bölümü yazılacak stream'e yaz
                writeStream.Write(buffer, 0, bufferLength);
                bufferLength = readStream.Read(buffer, 0, 256);
            }
            writeStream.Close();
            readStream.Close();
        }
    }
}
[/cc]

Bu sınıfla birlikte SQLEXPR_x64_ENU.exe dosyasını bilgisayara kaydedecek kodu tamamlamış olduk. Bu sınıf Installer sınıfından türemesinden ve [RunInstaller(true)] özelliğinin true olmasından dolayı kurulum esnasında ve sonrasında setup tarafından çağırılabilir. Zaten amacımız da buydu. Program yüklenirken, SQL’ in setup dosyasını bilgisayara kopyalamak. Program ilk çalıştığında da SQL’ in express sürümünü bilgisayara kurmak.

Şimdi copySQL sınıfının referansını setup1 projesine eklemeliyiz. Tekrar File System sekmesine dönüyoruz. Application Folder seçili iken sağ tarafta sağ tık –> Add –> Project Output yolu ile açılan pencereden copySQL sınıfını seçiyoruz. Dosya aktarımının kurulum esnasında başlaması için yine Primary Output seçeneğini seçip bu sınıfı setup1 projesine ekliyoruz.

Şimdi yapılacak işlem, SQL Server’ ın kurulumun hangi aşamasında bilgisayara kopyalanacağını belirlemek olacak. Bunu yapmak için de Setup1 projesi seçili iken hemen yukarda bulunan Custom Actions Editor Seçeneğinden gerekli ayarlamaları yapmamız gerekiyor. Custom Actions Penceresini açtıktan sonra Install klasörü üzerinde sağ tık –> Add Custom Action seçeneğine tıklıoruz.(Aşağıdaki resim)

Açılan pencerede Application Folder içerisindeki copySQL projesini seçip Ok tuşuna tıklıyoruz.(Aşağıdaki resim) Bu adımla birlikte yukarda kodlarını verdiğim sınıf kurulum aşamasında çalışacak ve dosyayı bilgisayarın “Belgelerim” klasörüne kopyalayacak.

Şimdi yapılacak işlem, programın kurulduğu bilgisayarda SQL Server Express’ in ve veritabanının kurulu olup olmadığını kontrol etmek olacak. Aşağıda verdiğim metod ile SQLEXPRESS‘ in kurulu olup olmadığı kontrol edilebilir. Bu metod, formun load olayından çağırılmalıdır.

[cc lang='csharp' ]
private void Form1_Load(object sender, EventArgs e)
{
    checkSQL();            
}
private void checkSQL()
{
    //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names
    //Eğer bu bilgisayarda SQL SERVER veya SQLSERVEREXPRESS sürümü yüklendi ise yukarıda regedit bölümünde yüklü SQL SERVER instance'leri yer alacaktır.           
    string[] yuklusqller = (string[])Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Microsoft SQL Server").GetValue("InstalledInstances");
    //Eğer kullanıcının bilgisayarında SQLExpress yüklü değilse
    var yukluozellikler = (from s in yuklusqller where s.Contains("SQLEXPR_x64_ENU") select s).FirstOrDefault();
    if (yukluozellikler == null)
    {
        DialogResult sonuc = MessageBox.Show("Programı kullanabilmek için SQLEXPRESS gereklidir. Bu Programı Yüklemek istiyor musunuz?", "UYARI", MessageBoxButtons.YesNo);
        if (sonuc == DialogResult.Yes)
        {
            string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\SQLEXPR_x64_ENU.exe";
            Process pro = new Process();
            pro.StartInfo.FileName = path;
            //Aşağıdaki parametreleri SQLEXPRESS setup dosyama göndererek kurulumu başlatırsam kullanıcıya kurulum yeri v.s gibi bilgileri sormayacak ve doğrudan kuruluma geçecektir.
            pro.StartInfo.Arguments = "/qb INSTANCENAME=\"SQLEXPRESS\" INSTALLSQLDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLSHAREDDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLDATADIR=\"C:\\Program Files\\Microsoft SQL Server\" ADDLOCAL=\"All\" SQLAUTOSTART=1 SQLBROWSERAUTOSTART=0 SQLBROWSERACCOUNT=\"NT AUTHORITY\\SYSTEM\" SQLACCOUNT=\"NT AUTHORITY\\SYSTEM\" SECURITYMODE=SQL SAPWD=\"\" SQLCOLLATION=\"SQL_Latin1_General_Cp1_CS_AS\" DISABLENETWORKPROTOCOLS=0 ERRORREPORTING=1 ENABLERANU=0";
            //Process için pencere oluştur
            pro.StartInfo.CreateNoWindow = true;
            //Process arka planda çalışsın.
            pro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            pro.Start();
            //İSQL kurulumu bitene kadar bekle
            pro.WaitForExit();
        }
        else
        {
            //SQLEXPRESS'i kurmak istemiyorsa programı sonlandır
            this.Close();
        }
    }
}
[/cc]

 

SQLEXPRESS bilgisayara kurulduktan sonra, yapılacak işlem bir veritabanı ve bir tablo oluşturmak olacaktır. Bunun için de aşağıdaki metodu formun activated olayında çağırmamız gerekmekte. Formun activated olayını aşağıdaki resmi kullanarak açabiliriz. Proporties penceresinden form seçili iken “events” simgesine basalım. Aşağıdaki özellikler içinde, focus sekmesinin alındaki activated seçeneğine çift tıklandığında activated olayının içine otomatik olarak yönlendiriliyoruz.

 

[cc lang='csharp' ]
private void Form1_Activated(object sender, EventArgs e)
{
    createDB();
}
        void createDB()
{
    SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=deneme;Integrated security=true");
    //Aşağıdaki sorgu SQLEXPRESS üzerinde bizim veritabanımızın (SETUPPROJESI) olup olmadığını kontrol ediyor ve eğer yoksa böyle bir veritabanı oluşturuyor.
    SqlCommand cmd = new SqlCommand("if not exists(select * from sys.databases where name = 'deneme') begin CREATE DATABASE SETUPPROJESI ON PRIMARY (NAME = deneme_Data,FILENAME = 'C:\\deneme.mdf',SIZE = 3MB,MAXSIZE = 10MB, FILEGROWTH = 10%) LOG ON (NAME = deneme_Log,FILENAME = 'C:\\deneme.ldf',SIZE = 1MB,MAXSIZE = 5MB,FILEGROWTH = 10%) end");
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    //Şimdi de veritabanımız içerisinde tablomuzun olup olmadığına bakalım ve eğer tablomuz yoksa tablomuzu oluşturalım ve verilerimizi atalım.
    conn.ConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=deneme;Integrated security=true";            
    //Aşağıdaki sorgu Kullanicilar tablosunun olup olmadığına bakmakta ve eğer yoksa oluşturarak içerisine kayıtları eklemektedir.
    cmd.CommandText = "if not exists(select * from sys.tables where name = 'tbl_temelBilgiler') begin create table tbl_temelBilgiler(TcKimlikNo int primary key,ad nvarchar(50),SoyAd nvarchar(50),yas int ) insert into tbl_temelBilgiler (TcKimlikNo,ad,soyAd,yas) values('64394830987', 'Seref','AKYUZ','22') insert into tbl_temelBilgiler (TcKimlikNo,ad,soyAd,yas) values('64394830987', 'Seref','AKYUZ','22')  end";
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
}        
[/cc]

Visual Studio’ da bir c sharp projesinin setup’ ı nasıl oluşturulur, bu setup’ a veritabanı nasıl eklenir, resimlerle anlatmaya çalıştım. Faydalı olması dileğiyle…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir