Makale Özeti

Windows uygulamalarında, bildiğiniz üzere Click Once'ın "prerequisites" özelliğini kullanarak Framework, Windows Installer ya da SQL Express sürümlerini kurmak mümkün. Fakat ne VS 2008, nede VS 2010 ile kurulan bu SQL database'inin üzerine, veritabanınızı restore edemiyorsunuz. Çünkü Click Once'ın böyle bir desteği yok. Bu makalede, web üzerinde yer alacak tek tuşla, client'a önce .NET framework ardından SQL Server Express 2008 kurulumu ve akabinde backupını aldığımız DB nin otomatik restore işlemini gerçekleştireceğiz.

Makale

"Click Once" ile SQL Express 2008 üzerine DB restore işlemi

Merhaba arkadaşlar. Bugün size keyifli bir konu anlatıyor olacağım. Windows uygulamalarında, bildiğiniz üzere Click Once'ın "prerequisites" özelliğini kullanarak Framework, Windows Installer ya da SQL Express sürümlerini kurmak mümkün. Fakat ne VS 2008, nede VS 2010 ile kurulan bu SQL database'inin üzerine, veritabanınızı restore edemiyorsunuz.

İnterneti dolaştığınızda Türkçe kaynaklarda zaten yeterli bilgi olmadığını, yabancı kaynaklarda da birbirinden bağımsız başlıklarda konunun işlendiğini görüyorsunuz. Bu makalade, hem Türkçe içerik sağlamak hem de bu çetrefilli mevzuyu açıklığa kavuşturmak adına bir bütün olarak konuyu işliyor olacağız.

Sayfa sonunda örnek projemizin download linkini veriyor olacağım. Solution'ı VS 2010 üzerinde açıp inceleyebilirsiniz. İçerisinde örnek Database'imiz, Bootstrapper Manifest Generator kurulum dosyası ve burada yapacağımız örnek projenin kaynak kodları yer alıyor.

Sözü daha fazla uzatmadan yol haritamızı belirleyelim :

  1. Uygulamamızın kullandığı veritabanının Backup alınması
  2. SQL'e bağlanıp DB yi restore edecek Class Library'in oluşturulması
  3. Bu library'i kullanarak, işlemi gerçekleştirecek bir MSI paketinin hazırlanması
  4. VS 2010'un bu setup'ı Prerequisites olarak görebilmesi için Bootsrapper konfigurasyonu
  5. Ve Click Once ile programın dağıtımı

1. SQL Backup

1. SQL Server Management Studio'yu kullanarak DB üzerinde sağ klikleyip Tasks - Back Up diyoruz.

Sql backup

2. Açılan ekranda sırasıyla, Add - ... (üç noktalı düğme) dedikten sonra, Backup'ı alacağımız lokasyonu seçin. Ardından File Name kısmına veritabanımızın adını yazın. Örn : HaliYikama.bak

Veritabanı backup

Burda bir hatırlatma yapmak istiyorum. Eğer backup aldığınız isim, veritabanından farklı bir isim ise restore işleminde problem yaşarsınız. Normalde backuplarınıza istediğiniz ismi (mesela tarih içeren) verebiliyorsunuz. Çünkü restore edeceğiniz yer de aynı olduğu için problem yaşamıyorsunuz. Fakat burada, veritabanınız client'a kurulduğunda hangi sürücüde yer alacağını bilemezsiniz. Hatta .bak dosyasının bulunduğu directory de backup alındığı yere göre farklı olacaktır. Bu sebeple restore işlemini gerçekleştirecek "Installer Class" fonksiyonunda, .mdf ve .ldf dosyaları oluşturulurken database adı parametrik gelecektir. O yüzden veritabanınızın adı neyse backup adı da aynı olsun.

Konumuz dışında ama günün bonusu olsun. Madem konu açıldı, bir bilgi daha verelim. SQL DB'lerini Backup aldığınız lokasyondan farklı bir lokasyona restore ederken hata alacağınızı söyledik. Peki çözüm ne ? Çözüm şu : SQL'de query analyzer ekranını açarak şu satırı çalıştırın :

restore FILELISTONLY from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\VeritabaniBackup.bak'

Bu sorgu size backup dosyasının LogicalName'ini verecektir. Bu LogicalName'i de aşağıda yer alan kod bloğunda siyah alanla değiştirin.Böylece DB'nizi istediğiniz lokasyonu restore edebilirsiniz :

restore database Veritabanim
from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\HaliOtomasyonu.bak'
with move 'LogicalName' to 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\Test\Veritabanim.mdf',
move 'LogicalName_log' to 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\Test\Veritabanim_log.ldf'

2. SQL'i restore edecek Class Library

Gelelim SQL'e bağlanıp restore işlemini yapacak fonksiyona.

1. Ama öncesinde tüm projelerimizi altında toplayacağımız bir Solution oluşturmakla başlayalım Visual Studio 2010'u açıp New Project diyoruz. Sol taraftan Other Project Types - Visual Studio Solutions'ı seçerek, aşağıda yer alan Name kısmına da ClickOnceSQL diyelim.

Visual Studio New Project

2. Şimdi Class Library'imizi oluşturalım.Oluşturduğumuz solution üzerinde sağ klik Add - New Project

Add new project

Açılan ekranda, Visual C# - Class Library'i seçip projemize bir isim verelim : CreatingDB

Creating DB

3. İşlem sonrasında otomatik oluşturulan Class1.cs dosyasını silelim. Ardından bu projeye bir Installer Class ekleyeceğiz. Proje üzerinde sağ klik, Add - New Item dedikten sonra sırasıyla Visual C# Items - Installer Class'ı seçip Name kısmını Installer1.cs olarak bırakıyoruz, ardından Add tuşuna basarak işlemimizi tamamlıyoruz.

installer class

4. Sayfa açıldığında design modu aktif olacağından "click here to switch to code view" diyerek codebehind'a geçelim. Burada kodlamaya başlamadan önce biraz Microsoft.SqlServer.Management.Smo namespace'inden bahsedelim. Gerkçekten mükemmel bir assembly. İçinde barındırdığı class'lar sayesinde temel (core) SQL Server Database Engine objelerine erişebiliyor, instance, database, table, stored procedure ve view'leri yönetebiliyorsunuz. Bu namespace ile neler yapabileceğinize bir bakalım :

  • SQL Server Database'ine connect olabilme
  • Instance ayarlarını görüntüleme ve değiştirebilme
  • Database objelerini görüntüleme ve değiştirebilme
  • DDL (Data definition language) işlemleri
  • Database dependency işlemleri
  • Database maintenance işlemleri (Backup, Restore)
  • Database schema ve data transfer işlemleri

Kodlamamıza başlamadan önce aşağıdaki assembly'leri projemize reference olarak ekleyelim.SMO objelerini makinanızda şu adreste bulabilirsiniz : C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.SqlServer.Management.Sdk.Sfc
  • Microsoft.SqlServer.Smo
  • Microsoft.SqlServer.SmoExtended

ek olarak System.Windows.Forms assembly'sini de eklemeyi unutmayın.(.NET sekmesinde)

Daha sonra şu namespace'leri de sayfamızın başına ekleyerek kodlamamıza başlayalım.

using System.Data.SqlClient;
using System.IO;
using System.Security.AccessControl;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

public void RestoreDatabase(String databaseName, String filePath, String serverName, String userName, String password, String dataFilePath, String logFilePath)
{
// Restore işlemi için instance oluşturuyoruz
Restore sqlRestore = new Restore();

// Restore edilecek DB'mizi gösteriyoruz
BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
sqlRestore.Devices.Add(deviceItem);
sqlRestore.Database = databaseName;

// Database'e connect oluyoruz
ServerConnection connection;

if (userName == "") // Windows Authentication ile
{
SqlConnection sqlCon = new SqlConnection(@"Data Source=" + serverName + @"; Integrated Security=True;");
connection = new ServerConnection(sqlCon);
}
else // Server Authentication ile
connection = new ServerConnection(serverName, userName, password);

// Restore işlemi yapılıyor
Server sqlServer = new Server(connection);
Database db = sqlServer.Databases[databaseName];
sqlRestore.Action = RestoreActionType.Database;
String dataFileLocation = dataFilePath + databaseName + ".mdf";
String logFileLocation = logFilePath + databaseName + "_Log.ldf";
db = sqlServer.Databases[databaseName];
RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation));
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation));
sqlRestore.ReplaceDatabase = true;
sqlRestore.PercentCompleteNotification = 10;

try
{
sqlRestore.SqlRestore(sqlServer);
}
catch (Exception ex)
{
MessageBox.Show(ex.InnerException.ToString());
}

db = sqlServer.Databases[databaseName];
db.SetOnline();
sqlServer.Refresh();
}

public override void Commit(System.Collections.IDictionary savedState)
{
// Kurulumun yapıldığı klasöre gerekli izinlerin verilmesi
try
{
DirectorySecurity dirSec = Directory.GetAccessControl(Context.Parameters["TargetDir"]);
FileSystemAccessRule fsar = new FileSystemAccessRule
(@"NT AUTHORITY\NETWORK SERVICE"
, FileSystemRights.FullControl
, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit
, PropagationFlags.None
, AccessControlType.Allow);
dirSec.AddAccessRule(fsar);
Directory.SetAccessControl(Context.Parameters["TargetDir"], dirSec);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

// Aşağıdaki context parametrelerini ise birazdan setup dosyasından gönderiyor olacağız.
RestoreDatabase(Context.Parameters["databaseName"].ToString(),Context.Parameters["filePath"].ToString(), Context.Parameters["serverName"].ToString(),Context.Parameters["userName"].ToString(), Context.Parameters["password"].ToString(), Context.Parameters
["dataFilePath"].ToString(), Context.Parameters["logFilePath"].ToString());

base.Commit(savedState);
}

Açıklamaları kodların içine yazmaya çalıştım. Buradaki işlemimiz bu kadar. Şimdi bu Installer'ı kuracak setup projemizi hazırlayalım.

3. MSI (Setup) paketinin hazırlanması

Solution (ClickOnceSQL) üzerinde sağ klikleyip Add - New Project diyoruz. Açılan pencerenin sol tarafından sırasıyla Other Project Types - Setup and Deployment - Visual Studio Installer dedikten sonra Setup Project'i seçerek Name kısmına CreatingDBSetup ismini verelim. Ok deyip işlemimizi tamamlayalım.

MSI paketi

Sayfa açıldığında File System (CreatingDBSetup) tabı aktif olacaktır zaten. Aktif değilse, Solution Explorer'da önce CreatingDBSetup projesine bir kez tıklayın, üste mini ikonlar dizilecektir. Burda yer alan ikinci ikon File System Editor'e tıklayın.

MSI Setup

Sol tarafa explorer gelecektir. Burda, Application Folder üzerinde sağ klik, Add - Project Output diyoruz.

MSI-Setup

Açılan pencerede zaten Project olarak CreatingDB ve Primary Output seçili gelecektir. Direkt OK diyerek işlemimizi tamamlıyoruz.

MSI Setup

İşlem sonrasında CreatingDB adlı projemizin çalışması için gerekli olan tüm dependency'ler yüklenecektir. Bir işimiz daha kalıyor bu setup projesine dahil edeceğimiz. O da veritabanımız. Sağ taraftaki boş alanda sağ klikleyip Add - File diyoruz.

MSI Setup

Burada, yazımızın en başında aldığımız database backup'ını (.bak) gösteriyoruz.

MSI Setup

Ve son olarak bir de Database klasörü oluşturuyoruz Application Folder altında. Bunun da amacı, remote makinaya sql kurulduktan sonra restore edilecek .bak dosyasının .mdf ve .ldf lerinin bu klasörde yer alacak olması. Sol taraftaki panelde Application Folder üzerinde sağ klikleyin, Add - Folder diyerek oluşturduğunuz klasöre de Database ismini verin.Daha sonra Database klasörüne bir kez tıklayıp Properties ekranını açın (F4) Buradaki AlwaysCreate property'sini True olarak değiştirin.

MSI Setup

Gelelim parametrelerimizi göndermeye. Hatırlarsanız Installar Class'ı yazdığımızda public override void Commit metodunda Context.Parameters'lardan bahsetmiştik. Yani hangi serverı ya da veritabanını hedef gösterdiğimizi burada belirteceğiz. Yine Solution Explorer'da CreatingDBSetup projesi aktif iken üstteki ikonlardan en sondan ikincisi olan Custom Actions Editor'a tıklıyoruz. Sol tarafa panelimiz açılıyor.

Custom Actions Editor

Burada 4 klasör görüyorsunuz. Install, Commit, Rollback, Uninstall. Biraz sonra anlatacağımız işlemi, bu dört klasör için de gerçekleştiriyoruz. Birinci klasör ile başlayalım. Install klasörü üzerinde sağ klikleyelim, Add Custom Action dedikten sonra açılan pencerede Application Folder'a girip Primary output from CreatingDB (Active) 'i seçiyoruz. OK deyip ekrandan çıkıyoruz.

Add Custom Action

Böylece Install klasörünün altında Primary output from CreatingDB (Active) yer alacaktır. Buna bir kez tıklayıp (F4) Property penceresine bakıyoruz. Burada yer alan CustomActionData bölümüne şu stringi yazıyoruz. Bunlar, bizim parametrelerimiz olacak.

/TargetDir="[TARGETDIR]\" /databaseName="HaliYikama" /filePath="[TARGETDIR]HaliYikama.bak" /serverName=".\SQLEXPRESS" /userName="" /password="" /dataFilePath="[TARGETDIR]Database\\" /logFilePath="[TARGETDIR]Database\\"

CustomActiondata

Şimdi bu işlemi kalan 3 klasör için de (Commit, Rollback, Uninstall) aynen tekrar edin. Evet, böylece veritabanı restore işlemini gerçekleştirecek setup dosyamızı da hazırlamış olduk. Prerequisites'ın kurulum sırası hayati önem taşır. Siz Sql2008 Express'i kurmadan, DB restore işlemini gerçekleştirirseniz, tüm emekleriniz boşa gider. Prerequisites'ın öncelik sırasıyla alakalı önemli bir bilgiyi de bir sonraki maddenin sonunda anlatıyor olacağım. Kurulum sıralamasını bir XML dosyasında göstermemiz gerekecek. Neyse, şimdi gelelim Bootstrapper ile, hazırladığımız bu setup'ı, click once dağıtımına eklemeye.

4. Bootsrapper Manifest Generator ile VS 2010 Prerequisites'ı oluşturmak

BMG, Click Once ile uygulamamızı dağıtırken Prerequisites olarak seçtiğimiz programlara (bir üstteki ekran) bir yenisini eklemeye yarar. BMG sayesinde, hazırlayacağınız setup'ları Click Once'da prerequisites olarak gösterebilir, asıl programın kurulumundan önce bunların kurulmalarını sağlayabilirsiniz.

Bu kısa açıklamadan sonra, hemen bir üst maddede hazıladığımız setup dosyasını, BMG kullanarak gerekli kurulum haline dönüştürelim.

http://code.msdn.microsoft.com/bmg/Release/ProjectReleases.aspx?ReleaseId=1567 adresinden BMG2008Setup.msi'a tıklayarak programı indirelim. Ardından makinanıza kurulumunu yapın. Masaüstü'ne kısa yolunu atacaktır. Programı çalıştıralım. Açılan ekranda File-New dedikten sonra Package Manifest'i seçip OK diyelim.

Bootsrapper Manifest Generator

Açılan ekranda Project Name kısmına bir isim verin, örneğin : Restore DB

Bir alt satıra geçtiğinizde Product Code olarak da aynı ismi alacaktır. Dokunmayın.

Ekranın sol üstündeki ilk ikona (Add Install File) tıklayın. Browse dedikten sonra az evvel oluşturduğumuz setup projesinin Release klasöründeki .msi dosyasını adres gösterin. (D:\My Projects\Visual Studio 2010\ClickOnceSQL\CreatingDBSetup\Release) OK deyip ekrandan çıkın.

Bootstrapper Add Install File

Açılan yeni ekranda, "Display Name" kısmına da Restore DB yazın. Ardından yine sol üstte bulunan bu sefer ikinci ikona tıklayın (Build) İşlem sonrasında yeni bir pencere açılacak ve build işlem tamamlanacaktır.

BMG - Build

Açılan bu ekranın tepesinde build işleminin nereye yapıldığını görebilirsiniz. Bizim örnekte C:\Users\Ferhat\Documents\Restore DB şeklinde oldu. Bu adrese gidip, bir üst klasöre geçip Restore DB klasörünü olduğu gibi kopyalayın. Daha sonra bunu VS 2010'un prerequisites olarak görebilmesi için C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages adresine kopyalayın.

Böylece Bootstrapper işlemimizi tamamlanmış, VS 2010'un da bu paketi görmesini sağlanmış olduk. VS 2010'un bu yeni paketi görebilmesi için programı kapatıp açmanız gerektiğini de hatırlatalım.

Yukarıda, 3. maddenin sonunda belirttiğimiz prerequisites'ların öncelik sıralaması hakkında biraz bahsetmek istiyorum. Hepimiz de biliyoruz ki projede sağ klikleyip prerequisites belirtmemiz tek başına yeterli değil. Asıl önemli olan bu programların kurulum sırasıdır. Peki bu durumda ne olacak? Çünkü VS 2010'un (ya da önceki versiyonların) böyle bir desteği yok.

Visual Studio 2010'un prerequisites olarak gördüğü tüm programların, aslında bir directory altında yer aldığını söylemiştik. İncelemek amacıyla mesela SqlExpress2008 klasörüne girin (C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\SqlExpress2008\product.xml), karşınıza product.xml dosyası çıkacaktır. İşte bu dosya, aynı zamanda kurulum sıralamasını da tutan konfigurasyon dosyasıdır. Dosyayı biraz inecelediğinizde aşağıdaki yapıyı göreceksiniz.

<?xml version="1.0" encoding="utf-8"?>
<!-- SQL Express 2008 VS Bootstrapper : product.xml : Language neutral information -->
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Microsoft.Sql.Server.Express.10.0">
<RelatedProducts>
<EitherProducts>
<DependsOnProduct Code=".NETFramework,Version=v4.0" />
<DependsOnProduct Code="Microsoft.Net.Framework.3.5.SP1" />
</EitherProducts>
<DependsOnProduct Code="Microsoft.Windows.Installer.4.5" />
<IncludesProduct Code="Microsoft.Sql.Server.Express.1.0" />
<IncludesProduct Code="Microsoft.Sql.Server.Express.9.2" />
</RelatedProducts>
<PackageFiles>
<PackageFile Name="SqlExpressChk.exe" />
</PackageFiles>
</Product>

DependsOnProduct node'unda kurulum öncesinde hangi programın kurulması gerektiğini belirtirsiniz. Code property'sine de tam olarak ne yazacağınızı görmek için, eklemeyi düşündüğünüz Bootstrapper klasöründe yer alan product.xml dosyasının Product node'unun ProductCode property'sine bakmanız gerekir. Örnek :

<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Microsoft.Sql.Server.Express.10.0">

Özetle, BMG ile oluşturduğumuz Restore DB paketini C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages klasörüne kopyaladıktan sonra içindeki product.xml dosyasına şu satırları ekliyoruz.

<RelatedProducts>
<DependsOnProduct Code="Microsoft.Sql.Server.Express.10.0" />
</RelatedProducts>
</Product>

bu durumda son hali şöyle olacak :

<?xml version="1.0" encoding="utf-8"?>
<Product ProductCode="Restore.DB" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
<PackageFiles CopyAllPackageFiles="false">
<PackageFile Name="creatingdbsetup.msi" Hash="31E40D0C5D7BCA642E412EABF16E4C381EB7ADEB" />
</PackageFiles>
<Commands Reboot="Defer">
<Command PackageFile="creatingdbsetup.msi">
<ExitCodes>
<DefaultExitCode Result="Success" String="Anunexpectedexitcodewasr" FormatMessageFromSystem="true" />
</ExitCodes>
</Command>
</Commands>
<RelatedProducts>
<DependsOnProduct Code="Microsoft.Sql.Server.Express.10.0" />
</RelatedProducts>
</Product>

Bu işlemi yapmazsanız, koca proje çöpe atılır. Çünkü Restore DB setup'ınız SQL Express kurulumundan önce çalışır. Böylece olmayan bir veritabanına, DB'yi restore etmiş olursunuz.

Bu değişliği yapmadığınızda ClickOnce ile dağıtılacak programın ekran görüntüsü şöyle olacaktı :

Click Once - Installation Order

Dikkat ederseniz Restore DB paketimiz, SQL Server 2008 Express'ten önce yer almakta. Hatırlatmakta fayda var ki, buradaki sıralama, aynı zamanda kurulum sıralamasıdır.

Product.xml dosyasında yaptığımız <DependsOnProduct Code="Microsoft.Sql.Server.Express.10.0" /> değişikliğinden sonra ClickOnce ekranımız şöyle oldu :

Click Once - DepedsOnProduct

İşte bu ekran, bizim beklediğimiz ekran :)

Evet, BMG ile işimiz bu kadar. Şimdi gelelim sadede. Click Once ile programın dağıtımına başlıyoruz.

5. Click Once ile programın dağıtımı

Burada bahsedeceğim ADO.NET Entiy Data Model ve WPF Windows Application bu makalenin konusu olmadığından detaylarına girmeyeceğim. Konu hakkında bilginiz yoksa öncesinde bir kaç makale okuyabilirsiniz. Ama özetle yapmak istediğim şey, bir windows uygulamasının bir data katmanını kullanarak kendi localindeki DB'ye erişmesi. Bunu siz, WPF yerine klasik bir Windows Forms kullanarak, ADO.NET Entity Framework yerine de LINQ to SQL Classes kullanarak yapabilirsiniz.

Hadi başlayalım. Solution'a CreatingDB.Data isminde yeni bir Class Library projesi ekliyorum. Bu, windows uygulamasının kullanacağı data katmanı olacak. Eklediğim bu projeye ADO.NET Entity Data Model ekleyerek local'deki DB'ye Windows Authentication ile connect oluyorum.

Bu işlemden sonra son projemiz kalıyor. Solution'a bir de WPF Application ekliyorum. Bu uygulama az evvel oluşturduğumuz data katmanını da kullanarak veriye erişecek. Bunun için References'tan Add Reference-Project diyerek az önce oluşturduğum data projesini ekliyorum. Projenin Entity Framework ile çalışabilmesi için de yine Add Reference - .NET sekmesinden System.Data.Entity namespace'i ekliyorum. Son olarak, WPF uygulamasının connection stringinin yönetebilmesi (override edilebilmesi) için projeye bir de Application Configuration File (App.config) dosyası ekliyor ve içine data katmanında (CreatingDB.Data) yer alan App.Config içeriğini kopyalıyorum.

WPF uygulamasına (MainWindow.xaml) bir button ve bir datagrid ekliyorum. Datagrid'in sütün yapısı ise şöyle :

<DataGrid AutoGenerateColumns="False" Height="80" HorizontalAlignment="Left" Margin="35,70,0,0" Name="dataGrid1"
VerticalAlignment="Top" Width="323" ItemsSource="{Binding}" >

<DataGrid.Columns>
<DataGridTextColumn Header="Adı" Width="135" Binding="{Binding Name}" IsReadOnly="True"/>
<DataGridTextColumn Header="Adresi" Width="135" Binding="{Binding Address}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>

Button'un click event'inin codebehind kodu da şöyle :

private void button1_Click(object sender, RoutedEventArgs e)
{
try
{
CreatingDB.Data.HaliYikamaEntities context = new Data.HaliYikamaEntities();
dataGrid1.DataContext = context.CustomerSet;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

WPF projesinin üzerinde sağ klikleyip "Set as StartUp Project" dedikten sonra önce bir compile edin, hata var mı diye bir bakın. Hata yoksa F5 diyerek projenizi çalıştırın. Button'a bastığınızda CustomerSet tablosundaki kayıtlar ekranda listelenecektir.

Bir hatırlatma !

Eğer geliştirme yaptığınız local veritabanınız SQL Express değil de Enterpise ya da Developer sürümü ise Click Once Deployment'ından önce application configuration (app.config) dosyanızdaki connection string'te bir düzeltme yapmanız gerekecektir. Çünkü Client'a kurulacak olan DB, Enterprise değil, SQL Express 2008 olacaktır. Bu durumda App.config'te yer alan connection string'inizdeki

Data Source=.\; ifadesi

Data Source=.\SQLEXPRESS; olarak değiştirilmelidir.

Lütfen buna dikkat edin. WPF (Windows App) projenizdeki App.config dosyasının son hali şöyle olmalıdır :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="HaliYikamaEntities" connectionString= "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;Initial Catalog=HaliYikama;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>

Buraya kadar sorun yoksa, gelelim Click Once dağıtımına. Ama öncesinde VS 2010'u kapatıp açın. Ki yeni prerequisite'ımız VS 2010 tarafından görülebilsin.

WPF projesi üzerinde sağ klikleyin, Properties dedikten sonra Publish sekmesine gelin. Burada Prerequisites tuşuna tıklayın. Çıkan ekranda bizim eklediğimiz Restore DB'yi göreceksiniz. Bunu ve SQL Server 2008 Express'i seçin. Sistem tarafından zaten Microsoft. .NET Framework 4 Client Profile(x86 and x64) ve Windows Installer 4.5 seçili gelecektir. Bu durumda toplam 4 adet prerequisite seçili olacaktır. OK deyip bu ekrandan da çıkın.

Click Once - Prerequisites

Updates tuşuna tıklayın. Açılan ekranda da The application should check for updates kutucuğunu işaretleyin. Böylece, yeni versiyonu publish ettiğinizde client'lar haberdar edilecek, yeni versiyonu indirip kurmaları sağlanacaktır. OK deyip bu ekrandan da çıkıyoruz.

Click Once - Update

Sayfa sonunda yer alan Publish Wizard'a tıklayıp yayınlama bölümüne geçelim. Browse deyip masaüstü'nde oluşturduğum Publish klasörünü adres gösteriyorum.

Click Once - Publish

Next ile bir sonraki ekrana geçiyoruz. Burada, kullanıcıların programı nereden kuracağını soruyor. Bir web sitesini adres gösteriyoruz.

Click Once - how will users install the application

Next ile bir sonraki ekrana geçiyoruz. Buradaki soru ise programın online mı offline'mı çalışacağı. Biz ilk seçeneği işaretliyoruz.

Click Once - Online offline

Son ekranda da FINISH diyerek işlemimizi tamamlıyoruz.İkinci ekranda verdiğimiz web sitesinden programın kurulumunu gerçekleştirebiliriz. Örneğin : http://www.fkaratas.com/app/publish.htm

Web adresini açtığınızda en altta bir Install tuşu ve üstünde de kurulması gereken programları göreceksiniz. Install tuşuna basarak kurulumu başlatalım. Install'a bastığınızda çıkan ekranda Çalıştır demeniz yeterli. Program download edilir ve kurulmaya başlanır.

ClickOnce

İlk kurulum Microsoft .NET Framework 4 Client Profile (x86 and x64) olacaktır.* Çıkan ekranda "Accept" deyin. (.NET framework 4 makinanızda kuruluysa bunu sormayacaktır.)

Prerequisites - .NET Framework

* Benim kurulum testi yaptığım makinada (XP Service Pack 3) Windows Installer 3.1 var olduğundan, yukarıdaki sıralamada bunu sormadı. Dolayısıyla download listesine de almadı. Prerequisites ve Click Once kavramı zaten bunu gerektiyor.

Bir sonraki ekranda SQL Server 2008 Express kurulumunu sorar, ona da "Accept" deyin.

Click Once - Sql Server Express 2008

Sonraki ekranda ise hazırladığımız "Restore DB" kurulumunu soracaktır. Buna da Install diyerek devam edin.

Click Once - Restore DB

Böylece gerekli tüm programların download işlemi başlayacaktır.

ClickOnce - Downloading prerequisites

Gerekli olan programların download işlemi başladıktan sonra, sırasıyla kurulumar başlayacaktır. .NET Framework kurulumundan sonra sizden bir restart isteyecektir.

Click Once - Reboot require

Restart sonrası SQL Server 2008 Express ve en son olarak da Restore DB kurulumu başlayacaktır.

Click Once - SQL Server 2008 Express installation

Prerequisites kurulumları tamamlandıktan sonra asıl uygulamanın kurulumuna geçilecek ve akabinde program açılacaktır.

Umarım, ihtiyacı olanlar için faydalı olmuştur.

Kolay gelsin,

 

Örnek projeyi buradan indirebilirsiniz.

Örnek projeyi buradan indirebilirsiniz.