Dinamik Connection String Oluşturma

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...