21 Kasım 2017 Salı
Twitter

Dinamik Connection String Oluşturma

Bu yazımda, dinamik olarak connection string bilgisi oluşturan bir class göreceksiniz.

Genel olarak connection string (veritabanı bağlantı cümleciği olarak çevirebilir miyiz? Ne dersiniz?) bilgisini web.config dosyasında static olarak tutarız.

Ancak bazı durumlarda bu bilginin dinamik olarak oluşturulmasını isteyebileceğiniz durumlar oluşabilir.

Ben de bu gibi durumlar için kullanabileceğiniz ConnStrGenerator adında bir class yazdım.

Hem basit / klasik bağlantılar hem de Entity Framework için kullanabilirsiniz.

ConnStrGenerator.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using System.Data.EntityClient;
 
public class ConnStrGenerator
{
    private static string basit = "";
    private static string ef = "";
 
    public static string Basit
    {
        get
        {
            if (!string.IsNullOrEmpty(basit)) return basit;
 
            var context = HttpContext.Current;
            string xml = context.Server.MapPath("~/App_Data/server.xml");
            XElement xel = XElement.Load(xml);
            basit = string.Format(@"server={0};User Id={1};password={2};database={3};",
                                        xel.Element("Server").Value,
                                        xel.Element("User").Value,
                                        xel.Element("Password").Value,
                                        xel.Element("Database").Value);
            return basit;
        }
    }
 
    public static string EF
    {
        get
        {
            if (!string.IsNullOrEmpty(ef)) return ef;
 
            var context = HttpContext.Current;
            string xml = context.Server.MapPath("~/App_Data/server.xml");
            XElement xel = XElement.Load(xml);
 
            var entityConnectionStringBuilder = new EntityConnectionStringBuilder();
            entityConnectionStringBuilder.Provider = xel.Element("Provider").Value;
            entityConnectionStringBuilder.ProviderConnectionString = Basit;
            entityConnectionStringBuilder.Metadata = xel.Element("MetaData").Value;
            ef = entityConnectionStringBuilder.ToString();
 
            return ef;
        }
    }
 
    public static void Sifirla()
    {
        ef = "";
        basit = "";
    }
}

Projenize, System.Data.EntityClient'ı refere etmeyi unutmayın.

ConnStrGenerator, bilgileri App_Data altındaki server.xml dosyasından okuyor.

server.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Server>
  <Server>localhost</Server>
  <User>root</User>
  <Password>1234</Password>
  <Database>mydatabase</Database>
  <Provider>MySql.Data.MySqlClient</Provider>
  <MetaData>res://*/my_ef.csdl|res://*/my_ef.ssdl|res://*/my_ef.msl</MetaData>
</Server>


Şimdi bu classı basit bir form aracılığı ile test edelim:

<asp:Button ID="btnBasit" runat="server" Text="Basit" OnClick="btnBasit_Click" />
<asp:Button ID="btnEF" runat="server" Text="EF" OnClick="btnEF_Click" />
<br />
<asp:Label ID="lblConnStr" runat="server" />
protected void btnBasit_Click(object sender, EventArgs e)
{
    lblConnStr.Text = ConnStrGenerator.Basit;
}
protected void btnEF_Click(object sender, EventArgs e)
{
    lblConnStr.Text = ConnStrGenerator.EF;
}

Sonuç:

server=localhost;User Id=root;password=1234;database=mydatabase;

 

metadata=res://*/my_ef.csdl|res://*/my_ef.ssdl|res://*/my_ef.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;User Id=root;password=1234;database=mydatabase;"

Güzel, basit ve etkili bir yöntem.

Bu class ı Windows Form'da kullanmak isterseniz tek yapmanız gereken Server.MapPath() satırını şu şekilde değiştirmek:

...
string xml = AppDomain.CurrentDomain.BaseDirectory + @"Data\server.xml";
XElement xel = XElement.Load(xml);
...

Dosya yolunu kendinize göre değiştirmelisiniz.

Örnek kodları buradan indirebilirsiniz.

Kolay gelsin...

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 4,78 (6 oy)
Yazıdaki kodların kalitesi Puan: 4,94 (6 oy)
İhtiyaca cevap verme Puan: 4,88 (6 oy)
Tavsiye edilebilirlik Puan: 4,89 (6 oy)
Genel değerlendirme Puan: 4,66 (6 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumlarý
  • Facebook Yorumlarý Facebook Yorumlarý
Yeni yorum yaz Toplam: 3, Onay bekleyen: 0.
  1. Şükrü sağlam

    Devri hocam güzel ve kullanışlı bir yöntem . Bir de bu yazıdan faydalanabilecek arkadaşlar için bir hatırlatma yapayım ; bu yöntem için windows formda xml yolunun farklı olması sorun teşkil etmeyebilir ama web tabanlı kullanımda App_Data klasörü harici seçimler risk taşımaktadır.

  2. Samet

    Öncelikle teşekkürler anlatım için hocam emeğinize sağlık ancak bir sorum olacak EntityFramework` çalışma anında değiştirmem gerekiyor connection string`i ve bağlanacağım db`lerdeki tablolar farklı olabiliyor bu durumda ne yapmam lazım ? Tek bir windows uygulamam var ve bu uygulama 2 farklı database`e bağlanıp işlem yapabilecek ve tablolarda farklı olabilir

    • Devrim Altınkurt

      merhaba,
      bu dediğin EF ye göre bir iş değil. 2 ayrı EF model oluşturup bu modellerle çalışman gerekiyor. düz sql commandlerinde string birleştirme ile rahat rahat dediğini yapabilirsin ama EF tarafında zor. :)