February 3, 2008
@ 05:08 PM

Üzerinde çalıştığım bir oyun projesinde yarış zamanlarını ve rezervasyon durumunu gösteren bir sayfa tasarlıyordum.Select işlemini stored proc ile yaptım, yarışa alınacak max kişi sayısını ve mevcut rezervasyon yapan kişi sayısını okuyordum.Sp execute süresi 9 sn idi, aspx in gridview rowdatabound daki işlemleri de ekleyince işlem süresi yaklaşık 15 sn ye ulaşıyordu.

Yarışa alınacak max kişi sayısını page load da okuyup bir dataset e atmayı ve dataview ile gridview in rowdatabound olayında filtrelemeyi denedim.Sp tarafında yarışa alınacak max kişi sayısını çıkardığımda execute süresi 0sn ye indi.Bu güzel bir gelişmeydi fakat sayfayı çalıştırdığımda bu sefer sürenin 16-17 sn ye çıktığını gördüm.

Çaresiz kalmıştım.Birden aklıma DataView yerine HashTable kullanmak geldi.Max kişi sayısını page loadda okuyup hashtable a ekledim.Gridview un rowdatabound olayında da max kişi sayısına HashTable i kullanarak ulaştım.Sonuç inanılmazdı.Sayfa 1 sn den az bir zamanda geliyordu.


 
Categories: Software

January 6, 2008
@ 12:53 AM

Asp.net projelerinizde veritabanı erişimlerini App_Code dir'i icinde tanımladığınız sınıflar içinden yapmak isteyebilirsiniz.Eğer projenizde access veritabanı kullanıyorsanız Server.MapPath() metodunu kullanmakta sorun yaşarsınız çünkü App_Code içindeki bir sınıfta Server sınıfı tanımlı değildir.

App_Code dir i içindeki bir sınıfta Server.MapPath() metodunu aşağıdaki şekilde kullanabilirsiniz.

HttpServerUtility hs=HttpContext.Current.Server;
string APPDATAYOLU = hs.MapPath("~/App_Data");

Kolay gelsin


 
Categories: Software

January 5, 2008
@ 09:44 PM
Asp.net projelerinde genelde verinin db den okunması için sqldatasource 
nesneleri kullanırız.Fakat kullanıcının arama yapması gibi durumlarda 
dinamik sql yaratmamız gerekebilir.Bu tür durumlarda Gridview nesnesinin
datasource özelliğine codebehind da yarattığımız bir DataSet nesnesini
atarız.





Örnek bir search

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        SqlConnection conSQL = new SqlConnection(
            ConfigurationManager.
               ConnectionStrings["XConnectionString"].
                  ConnectionString);
        SqlCommand cmdSQL = new SqlCommand();
       
        string strSQL = "select x,y,z from a_tbl
 where ";

        if (this.txtX.Text.Trim().Length > 0)
        {
            strSQL += "x like @X and ";
            cmdSQL.Parameters.Add(new
               SqlParameter("@X", this.txtX.Text.Trim()));
        }
        if (this.txtY.Text.Trim().Length > 0)
        {
            strSQL += "y like @Y and ";
            cmdSQL.Parameters.Add(
               new SqlParameter("@Y", this.txtY.Text.Trim()));
        }

        if (strSQL.Substring(strSQL.Length - 5, 5) == " and ")
            strSQL = strSQL.Substring(0, strSQL.Length - 5);
        if (strSQL.Substring(strSQL.Length - 7, 7) == " where ")
            strSQL = strSQL.Substring(0, strSQL.Length - 7);

        try
        {
            conSQL.Open();
        }
        catch (Exception excp)
        {
            this.lblSearchInfo.Text = "Hata oluştu -> " +
               excp.Message;
            return;
        }
        cmdSQL.Connection = conSQL;
        cmdSQL.CommandText = strSQL;
        SqlDataReader drdSQL = null;
        DataSet dsSQL = new DataSet();
        try
        {
            drdSQL = cmdSQL.ExecuteReader();
        }
        catch (Exception excp)
        {
            conSQL.Close();
            this.lblSearchInfo.Text = excp.Message;
            return;
        }
        dsSQL.Load(drdSQL, LoadOption.OverwriteChanges,
            new string[] { "a_tbl" });
        drdSQL.Close();
        conSQL.Close();
        this.gvwCus.DataSource = dsSQL;
        this.gvwCus.DataBind();
    }

Son iki satırda gördüğünüz gibi gvwCus Gridview'umuza dsSQL dataset'ini
dinamik olarak bağlıyoruz.Fakat eğer gridview un paging özelliğini true
olarak set edersek bu birsonraki sayfaya gitmeye kalktığımızda hata
almamıza neden olacaktır.

Bu sorun can sıkıcı olsa da çözümü basittir.İlk olarak DataSet nesnesini
ister class'ın en üstüne private static olarak tanımlayın, isterseniz
ViewState veya Session bazında saklayın, dataset'ın sınıfın her
üyesinden ulaşılabilecek hale getirin.

Bu durumda ben viewstate'i kullanıyorum.
Search'ün son iki satırını aşağıdaki gibi değiştiriyorum.

         ViewState["a_tbl"] = dsSQL;         
        this.gvwCus.DataSource = dsSQL;
       
this
.gvwCus.DataBind();
    }

Ardından Gridview'un PageIndexChanging eventine aşağıdaki kodu yazın.

    protected void gvwCus_PageIndexChanging(object sender,
      GridViewPageEventArgs e)
    {
        gvwCus.PageIndex = e.NewPageIndex;
        this.gvwCus.DataSource = (DataSet)ViewState["a_tbl"];
        gvwCus.DataBind();
    }

Sorununuz bu şekilde çözülmüş olur.


 
Categories: Software

January 4, 2008
@ 01:20 PM

Yorumsuz...


 
Categories: Genel

January 3, 2008
@ 07:27 PM

Bu akşam Diyarbakır daki patlamayı işten eve gelirken arabada haber aldım.Eve gidip detayları öğrendiğimde durumun kötü olduğunu öğrendim.

Ardından bir haber kanalında aşağıdaki vahim sorunun sorulduğuna şahit oldum.
-Acaba Türkiye turistler için güvenli bir yer mi?

Acaba hangi zihniyet turistleri kendi vatandaşlarından daha önce tutar?

Patlamada ölen vatandaşlarımıza allahtan rahmet sevenlerine,yakınlarına sabır diliyorum.


 
Categories: Genel

December 31, 2007
@ 05:08 PM

C#'daki using direktifini hepimiz biliyoruz.

using System;
using System.Data;

Peki tam olarak ne yapıyor bu using? İlk aşamada bilinen görevini açıklayayım.Using direktifleri yazarak, kullanacağınız sınıfın namespace'ini tekrar tekrar bildirmenize gerek kalmaz.

Örneğin "using System.Data.SqlClient;" kodunu yazdığınızda bir SqlParameter nesnesi yaratmak için;

System.Data.SqlClient.SqlParameter paramSQL1 = 
new System.Data.SqlClient.SqlParameter();

yazmanıza gerek kalmaz.

SqlParameter paramSQL1 = new SqlParameter();

kodu ile tanımlamayı yapabilirsiniz.

Bunun yanısıra using direktifi ile aliaslar yaratabiliriz.Ooo süper.Ee nedir bu alias?
Aynı projede farklı namespaceler içinde projeler geliştirebiliriz.Örneğin "AndromedaM31SarmalGalaksi" ve "M33SpiralGalaksi" namespace lerimiz olsun.
"AndromedaM31SarmalGalaksi" namespace i icinde "Yıldız" isminde bir sınıfımız olsun.Aynı şekilde ikinci galaksimiz "M33SpiralGalaksi" namespace'inde de
"Yıldız" isminde bir sınıfımız olsun.

Bu iki namespace'i aynı projede kullandığımızda Yıldız sınıfları çakışacaktır.



"Ambiguous name - choose from the following :)" mesajı ile Microsoft'ta da ne kadar espritüel kod geliştiren arkadaşlarımızın olduğunuda anlamış oluyoruz :P

Dolayısı ile hangi galaksi (namespace) için Yıldız sınıfını yarattığımızı belirtmemiz gerekir.
Bu tür durumlarda using direktifi ile alias tanımlarız.

Örnek proje:

using System;
using System.Collections.Generic;
using System.Text;

using AndromedaM31SarmalGalaksi;
using M33SpiralGalaksi;

namespace ConsoleApplication1
{
    using AndromedaM31SarmalGalaksi;
    using M33 = M33SpiralGalaksi.Yildiz; // İŞTE ALIAS IMIZ...

    class Program
    {
        static void Main(string[] args)
        {
            // M33 alias ını kullanarak direkt olarak
            // M33SpiralGalaksi.Yildiz
            // sınıfını hedeflemiş bulunuyoruz...
M33 a = new M33();
Yildiz b = new Yildiz(); Console.WriteLine(a.ToString()); Console.WriteLine(b.ToString()); } } } namespace AndromedaM31SarmalGalaksi { public class Yildiz { public override string ToString() { return "Andromeda M31 Sarmal Galaksi"; } } } namespace M33SpiralGalaksi { public class Yildiz { public override string ToString() { return "M33 Spiral Galaksi"; } } }




Projenin çıktısı;

şeklinde olacaktır.

Gelelim using'in farklı bir kullanımına...
MSDN der ki : Defines a scope, outside of which an object or objects will be disposed.

Yani der ki using size, imlecin dışarı çıktığı anda using le yaratılan nesne veya nesnelerin yokedileceği bir blok yaratmanızı sağlar.
Unutmadan değinmek isterim using ile yaratılacak nesneler IDisposable arayüzünü uygulamış olmalıdırlar!

using (nesne yaratma işlemi)
{
}
//yarattığımız nesne imleç bu satıra gelince yok olacaktır.

En güzel anlatım örnekli anlatımdır derler, hemen bir örnek yapalım.

using System;

class C : IDisposable
{
    public void UseLimitedResource()
    {
        Console.WriteLine("Using limited resource...");
    }

    void IDisposable.Dispose()
    {
        Console.WriteLine("Disposing limited resource.");
    }
}

class Program
{
    static void Main()
    {
        using (C c = new C())
        {
            c.UseLimitedResource();
        }
        Console.WriteLine("Now outside using statement.");
        Console.ReadLine();
    }
}

Çıktıya bakalım;



Evet tahmin ettiğimiz gibi; "Now outside using statement." mesajından önce imleç using kod bloğundan çıktığı için otomatik olarak C sınıfının Dispose metodu çağırılmıştır.

Alt tarafı using değil mi? :)
Hayırlı kodlamalar...

Kaynak:MSDN


 
Categories: Software

December 31, 2007
@ 01:22 PM

Herkesin yeni yılını kutlar, 2008'in herkese daha az patch,bug getirmesini ve sonumuzun aşağıdaki elemana benzememesini dilerim.


 
Categories: Genel

using i bilirsiniz.
using System.Data;
using System.Configuration;
....

bir de böyle deneyin ;

public
void InsertRow(string connectionString, string insertSQL)
{
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // The insertSQL string contains a SQL statement that
        // inserts a new row in the source table.
        OleDbCommand command = new OleDbCommand(insertSQL);

        // Set the Connection to the new OleDbConnection.
        command.Connection = connection;

        // Open the connection and execute the insert command.
        try
        {
            connection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        // The connection is automatically closed when the
        // code exits the using block.
    }
}

Kullanım sonunda belirttiği gibi imleç using bloğundan çıktığı anda bağlantı kapatılacaktır.Bu özelliği bana hatırlatan Emre arkadaşıma teşekkürü bir borç bilirim.


 
Categories: Software

December 30, 2007
@ 07:49 PM

Uzun bir aradan sonra herkese selamlar.

Oracle bundan birkaç hafta önce sunucu sanallaştırma ve konsolidasyonu hakkında çok önemli bir açıklama yaptı.Oracle piyasaya yeni bir Virtualization ürünü çıkarttığını bildirdi.Oracle'ın iddiasına göre OracleVM piyasadaki mevcut sanallaştırma yazılımlarından yaklaşık 3 kat hızlı çalışıyor.Oracle'ın sitesinden programı,vm management aracını ve bütün projenin kaynak kodunu indirebilirsiniz.

http://www.oracle.com/technologies/virtualization/index.html

Tabi ürünün hızına etki edecek, VmWare deki Vmotion,VirtualIron daki LiveMotion LiveMaintenance gibi özellikler Oracle VM de mevcut mu kontrol etmek lazım.Eğer bu özellikler mevcut değilse, Oracle'ın normal olarak daha hızlı olması gerekir.Ayrıca bu açıklama ile VmWare'ın kağıtlarının değerinin düştüğünü düşünürsek, Oracle'ın ciddi bir hata yaptığını söyleyebiliriz.

Eğer mevcut VM deki özellikler OracleVM de mevcutsa, sanallaştırma pazarında büyük bir rekabetin başlayacağını söyleyebilirim.Bu çok güzel çünkü rekabet hem kalitenin artması hem de fiyatın düşmesi demek.Her ne kadar müşteri tarafında bu iyi bir haber olsa da üretici tarafında kemerlerin sıkılması demek.Bu dengenin iyi korunması şart.

Oracle VM testleriyle ilgili bilgi veriyor olacağım.


 
Categories: Server Systems

Yöneticiliğini yaptığım bilişim şirketi yazılım || sistem ekibine aşağıdaki özelliklere uyan yazılım uzmanı || sistem mühendisi aramaktayım.İlgilenen arkadaşların lvntyldz@gmail.com email adresine cv lerini göndermelerini rica ederim.

Yazılım
- .NET Fw 2.0 - WinForms
- ASP.NET
- ASP.NET Web servisleri
- C#.net
- HTML XML SOAP JS CSS
- SOA || SAAS yapısı; .NET Fw Code Compiling,Application Domains,Plugin tabanlı programlama hakkında bilgi.
- MsSQL Server & TSQL

Sistem
- WSrv2K3 kurulum yönetimi
- Ms AD kurulum yönetimi
- Sanallaştırma Teknolojileri EMC ürünleri hakkında genel bilgi
- VmWare & virtual appliances genel bilgi
- Sun Microsystems sunucuları üzerinde deneyim


 
Categories: Genel