Makale Özeti

Bu makalemde Visual Studio Tools for Office Sunucu Dökümanları ve Cache kullanımı konularına değineceğim.

Makale

Tüm yazılımcı arkadaşlara selamlar,

Bu makalemde Visual Studio Tools for Office Sunucu Dökümanları ve Cache kullanımı konularına değineceğim.

VSTO Mimarisi
Hepimiz VSTO mimarisi ile gelen yenilikleri az çok hatırlıyoruzdur.Kısaca bahsetmek gerekirse;

-VSTO Microsoft Office ürün ailesi ile çalışması için tamamen baştan tasarlanmış bir yapıdır.
-VSTO .NET framework'ünü kullanır.VBA daki gibi dil yapısında herhangi bir kısıtlama yoktur.
-.NET framework CLR ve .NET framework FCL gibi yapıları kullanıma sunar.
-.NET kontrollerinin kullanımına olanak sağlar.
-NET yapısının %100 nesne yönelimli olmasından dolayı, programcının oop programlamadan yararlanmasını sağlar.
-Web servisleri Remoting gibi teknolojiler desteklenmektedir.
-Geliştirme arayüzü Vs2005 IDE'dir.
-Dağıtım ClickOnce teknolojisi ile desteklenmiştir.

Yeni mimaride en önemli noktalardan birisi Data/View ayrımının yapılmış olmasıdır.VSTO öncesinde, diğer bir uygulama Office dökümanlarına erişmeye çalıştığı zaman ilgili Office uygulaması başlatılıyor, dolayısı ile sadece veriyi manipüle etmek için view alt programları (formatlama,spell check...) da hafızaya yükleniyordu.

VSTO mimarisinde Data/View ayrımı gerçekleştirilmiştir.Sunucu dökümanı kavramı getirilmiştir.Verilerin XML data island (XML veri adaları) ile tutulması sağlanmış, bu sayede mobilite, çevrimdışı çalışma sağlanmıştır.

Şekilde gördüğünüz gibi yapı Client/Server ve Data dan oluşmaktadır.Burda önemli olan nokta Sunucu üzerinde herhangi bir Office uygulamasına gerek kalmadan VSTO 2005 Server Component leri kullanarak Office uygulamalarındaki veriyi manipüle edebiliyor oluşumuzdur.

Sunucu dökümanları(Server Documents)
Veri ile görünümün ayrıldığı noktadır.VSTO 2005 server components kullanılarak herhangi bir Office uygulamasına gerek kalmadan döküman içindeki bilgileri görüntüleyebilir,değiştirebilir, silebiliriz.Bu bize VSTO dışındaki teknolojileri kullanarak Office dökümanlarına erişimi sağlayacaktır.Örneğin bir Asp.NET veya bir Windows Service uygulamasında Office dökümanlarını açabilecek ve gerekli değişiklikleri yapabileceğiz.Buna ek olarak sınıfımızda bulunan bir nesneyi dökümanın cache'ine kaydederek çevrimdışı durumlarda kullanabiliriz.

VSTO dışındaki uygulamaları kullanarak Office dökümanlarına erişim için projeye;
Microsoft.VisualStudio.Tools.Applications.Runtime
referansını eklememiz gerekmektedir.

İsterseniz bu anlattıklarımızı bir örnekle pekiştirelim.Senaryomuzda bir Access veritabanından veri okuyup bu veriyi DataSet nesnesini kullanarak sunucu dökümanı üzerine kaydedelim ve bir Windows uygulamasından, DataSet'e erişelim.

Yeni bir Access veritabanı oluşturup aşağıdaki şekilde tablomuzu oluşturalım.

Yeni bir VSTO Excel uygulaması oluşturalım.Excel Workbook üzerine bir button nesnesi yerleştirip Click event'ine aşağıdaki kodu yapıştıralım.

 Veri Okuma
private void btnVeriOkuma_Click(object sender, EventArgs e)
{
    OleDbCommand olecomSQL = new OleDbCommand();
    OleDbConnection conOLEGFI = new OleDbConnection();
    conOLEGFI.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb";
    try
    {
        conOLEGFI.Open();
    }
    catch (OleDbException Excp)
    {
        //hata ayikla
        MessageBox.Show("Veritabanı ile bağlantıda bir problem oluştu.");
        return;
    }
    olecomSQL.CommandType = CommandType.Text;
    olecomSQL.CommandText = "select * from Table1";
    olecomSQL.Connection = conOLEGFI;
    OleDbDataReader olesdrOutFaxes = olecomSQL.ExecuteReader();

    ds1.Load(olesdrOutFaxes, LoadOption.OverwriteChanges, new string[] { "Table1" });
    conOLEGFI.Close();

    dataGridView1.DataSource = ds1.Tables[0];

    try
    {
        if(!this.IsCached("ds1"))
            this.StartCaching("ds1");
    }
    catch
    {

    }

}

Bu kodla veritabanına ulaşıp Table1 tablosundan okunan bilgileri ds1 DataSet nesnesi içine kaydediyoruz.Burda önemli olan kısım try catch bloğunda gerçekleşmektedir.Eğer dökümanda ds1 nesnesi cache olarak tutulmuyorsa this.StartCaching("ds1")  komutu ile Office dökümanının ds1 nesnesini cache'ine kaydetmesini sağlıyoruz.Bu bize ds1 nesnesi ile çevrimdışı çalışma imkanı sağlamaktadır.

ds1 Dataset nesnesini cache'e programatik olarak kaydetmemiz için ds1 nesnesinin public olarak yaratılmış olması gerekir.
Nesneyi cache'e eklemek için diğer bir yöntem ise 
[Microsoft.VisualStudio.Tools.Applications.Runtime.Cached()]
niteliği ile nesneyi işaretlemektir.
Ör:
[Microsoft.VisualStudio.Tools.Applications.Runtime.Cached()]
public DataSet ds1;

Şimdi yeni bir Windows uygulaması yaratıp excel dökümanı içindeki cache verisine ulaşalım.

Form üzerine bir DataGridView ve bir Button nesnesi yerleştirin ve Button Click olayına aşağıdaki kodu yazın.

 Windows Uygulaması üzerinden Office dökümanı cache bilgisine ulaşmak
private void button1_Click(object sender, EventArgs e)
{
    DataSet ds2 = new DataSet();

    string OfficeDoc = @"C:\ExcelWorkbook1.xls";            
    ServerDocument sd1 = null;

    try
    {
        sd1 = new ServerDocument(OfficeDoc);
   
        CachedDataHostItem dataHostItem1 =
                sd1.CachedData.HostItems[0];

        CachedDataItem dataItem1 = dataHostItem1.CachedData["ds1"];

        System.IO.StringReader schemaReader = new System.IO.StringReader(dataItem1.Schema);
        System.IO.StringReader xmlReader = new System.IO.StringReader(dataItem1.Xml);

        ds2.ReadXmlSchema(schemaReader);
        ds2.ReadXml(xmlReader);
    }
    finally
    {
        if (sd1 != null)
        {
            sd1.Close();
        }
    }

    dataGridView1.DataSource = ds2.Tables[0];

}

Projeyi çalıştırdığınızda Ofis dökümanına ait Cache bilgisinin okunduğunu göreceksiniz.

Sunucu dökümanları üzerinde nesnelerin cache bölümünde depolanmalarını iptal etmek için this.StopCaching(üyeismi) komutunu kullanmanız yeterli olacaktır.
Ör:
this.StopCaching("ds1");

Evet bir makalenin daha sonuna geldik.Umarım yararlı olmuştur.
Hepinize mutlu günler dilerim. 

Levent YILDIZ
theone@leventyildiz.net
msmoracle@hotmail.com 
http://www.leventyildiz.net