.Net Denemeleri

Setup And Attach Database

Bugün daha önce yazmış olduğum Setup & ConnectionString yazısına ek yapacağız.
Söz konusu ek;
mdfDataFile ve ldfLogFile dosyalarını VeritabanıDatabase sunucusuna eklemekAttach.

İlk öğrenmemiz gereken bu işi yapan DDL kodları;
(şu yazıda bunu nasıl yapabileceğiniz görebilirsiniz)

CREATE DATABASE [ornek] ON 
(FILENAME = N'E:\DataBases\ornek.mdf'),
(FILENAME = N'E:\DataBases\ornek_log.ldf')
FOR ATTACH

Daha sonra bu kodları kurulumsetup sırasında (OnAfterInstall) Ado.Net komutları ile çalıştırmakExecute etmek.

//DDL kodlarını oluşturalım
StringBuilder sb = new StringBuilder();
sb.Append("CREATE DATABASE [Ornek] ON\r\n");
sb.AppendFormat("(FILENAME = N'{0}'),\r\n",
    thisAss.Location.Replace(
            thisAss.GetName().Name + ".exe",
            "ornek.mdf")
    );
sb.AppendFormat("(FILENAME = N'{0}')\r\n",
        thisAss.Location.Replace(
            thisAss.GetName().Name + ".exe",
            "ornek_log.ldf")
    );
sb.Append("FOR ATTACH\r\n");
 
//oluşan DDL kodlarını ADO.NET ile çalıştıralım
using (SqlConnection con = new SqlConnection(value.Replace("ornek", "Master")))
{
    using (SqlCommand com = new SqlCommand(
        sb.ToString(), con))
    {
        con.Open();
        com.ExecuteNonQuery();
    }
}
14 Mayıs Cumartesi, 2011 | Ado.Net C# Sql

SqlBulkCopy İle Veri Kopyalama

Excel yada benzeri bir kaynaktan elde ettiğimiz yaklaşık bir milyon kayıt içeren bir DataTable olduğunu düşünelim. Bu kayıtları veritabanında ki x bir tabloya nasıl eklerizinsert?

Tek tek Insert yapmak mı? Bildiğin intihar olur.
DataAdapter ile UpdateGüncelleme yapmak mı? İnanılmaz zahmetli ve gereksiz.(Çalışacağından emin bile değilim)

Biri Bulk Insert mü dedi, işte aradığımız cevap.
Bulk Insert, yüklü miktarda ki verileri herhangi bir tablotableya performanslı bir şekilde eklemek için veri katmanında kullanabileceğimiz bir komuttur. Ado.Net teknolojisi SqlBulkCopy (kısaca sbc diyelim) nesnesi ile bu komutu kolaylıkla kullanmamıza olanak verir.
Tabi kullanımı bu kadar kısıtlamamak gerekir. Sbc ile iki farklı sunucu yada aynı sunucu içinde iki farklı tablo da kopyalanabilir.

Bir örnek ile açıklayalım;
Excel dosyasındaki verileri DataTable nesnesine dolduracağız. Peşinde sbc ile DataTable içindeki verileri örnek bir tabloya ekleyeceğiz.

Örnek Excel dosyası
Excel

Hedef tablo
Table

Excel dosyasındaki alanlar ile tablo alanfieldlarını bilerek farklı isimlendirdim. Sbc nesnesinin bir özelliği de bu gibi durumlarda alanları adresleyebilmesidirmapping.

//Excel -> DataTable
string SourceConnStr =
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\data.xls;Extended 
 Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";
DataTable SourceDT = null;
using (OleDbConnection SourceConn = new OleDbConnection(SourceConnStr))
{
    using (OleDbDataAdapter SourceDAP = new OleDbDataAdapter(
        "select * from [Contact]", SourceConn))
    {
        SourceDT = new DataTable("Contact");
        SourceDAP.Fill(SourceDT);
    }
}
 
//DataTable -> Sql
using (SqlConnection DestinationConn = new SqlConnection(
    "Data Source=.;Initial Catalog=Ordek;Integrated Security=True"))
{
    DestinationConn.Open();
    using (SqlBulkCopy SBC = new SqlBulkCopy(DestinationConn))
    {
        //Verilerin kopyalanacağı Tablo Adı
        SBC.DestinationTableName = "Kisiler";
        //Kaynak ile hedef alanlarının adları farklı ise
        //alanları adreslemek gerekir
        SBC.ColumnMappings.Add("ContactID", "ID");
        SBC.ColumnMappings.Add("FirstName", "Ad");
        SBC.ColumnMappings.Add("LastName", "Soyad");
        SBC.ColumnMappings.Add("EmailAddress", "Email");
        SBC.ColumnMappings.Add("Phone", "Telefon");
        //son olarak WriteToServer metotu ile kaynak hedefe kopyalanır
        SBC.WriteToServer(SourceDT);
        //DataTable dışında DataRow koleksiyonu yada DataReader nesnesi de
        //parametre olarak verilebilir.
    }
}

Örnek proje.

10 Eylül Cuma, 2010 | Ado.Net Sql

HashBytes ile Veri Katmanında Hash İşlemi

Bildiğiniz gibi verileri Hash'lemek için bir çok yöntem var. Bunlara alternatif olarak Ms Sql Server içindeki HashBytes sistem fonksiyonu ile de yapmak mümkün.

Fonksiyon iki adet parametre alır. İlk parametre Hash algoritmasının adı (MD2, MD4, MD5, SHA, SHA1) diğeri ise Hash'lenecek veri(varchar, nvarchar, varbinary). Fonksiyondan geriye ise varbinary tipinde bir değer döner (8000 bytes).

Örnek olarak, web uygulaması için basit bir login işlemi yapalım.

Örnek tablo:

create table SiteUsers
(
 userID int primary key identity(1,1),
 userName nvarchar(50),
 [passWord] varbinary(20)--SHA1 160bits > 20 bytes
)
go

Kayıt eklemek için bir procedure.

create proc InsertUser
 @userName nvarchar(50),
 @passWord nvarchar(50)
as
 insert SiteUsers
 values
 (@userName,HashBytes('SHA1', @passWord));
 select SCOPE_IDENTITY();
go

Son olarakta kullanıcı kontrolü yapan bir procedure.

create proc ValidateUser
 @userName nvarchar(50),
 @passWord nvarchar(50)
as
 if exists(select userID from SiteUsers 
     where userName = @userName 
     and 
     [passWord] = HashBytes('SHA1', @passWord))
  select 'Mevcut.'
 else
  select 'Mevcut değil.'
go

Script

14 Ekim Çarşamba, 2009 | Sql

Anket Uygulaması

Ben veri kaynağı olarak Xml kullanması severim de herkes sevmek yada bilmek zorunda değil. Xml ile yaptığım anket uygulamasını Sql ve Ado.Net kullanarak tekrar yaptım.

Veritabanı şeması aynen aşağıdaki gibi;

Database Diagram

Uygulamada kullanılan nesneclass diyagramı;

Class Diagram

Uygulamada kullanılan örnek kod;

public void OyVer(int AnketSoruID)
{
    using (SqlConnection con = new SqlConnection(
        "Data Source=.;Initial Catalog=calismalar;Integrated Security=True;"))
    {
        using (SqlCommand com = new SqlCommand(
            "update AnketSorular set AnketOy += 1 where AnketSoruID = @AnketSoruID", con))
        {
            com.Parameters.AddWithValue("@AnketSoruID", AnketSoruID);
            con.Open();
            com.ExecuteNonQuery();
        }
    }
}

Uygulama kaynak kodları da burada.
Sql script ise burada.

29 Ağustos Cumartesi, 2009 | Asp.net C# Ado.Net Sql

Northwind Kategori Resim Sorunu

Northwind sql eğitimlerinde sıkça kullandığım (basit yapısınsan dolayı) bir veri tabanı örneğidir. Aynı zamanda eskidir de :) En sık başvuru yaptığım tablolardan biri de Categories tablosudur. Bu tabloda kategorileri resimleri ile yer almaktadır.

northwind categories

Yer almasına alıyor da, alırken ilk 78 ve son 78 byte kısmında ole nesne bilgisi olduğu için kimi zaman sorunlar yaşanıyor.
 
northwind windows

Her ne kadar DataGridView kontrolü bunu otomatik gösterse de, manuel olarak PictureBox gibi bir kontrolde göstermek istersek şu şekilde kullanmak gerekiyor.

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Category cat in CategoryProcess.GetCategories())
        listBox1.Items.Add(cat);
}
 
private void button1_Click(object sender, EventArgs e)
{
    Category cat = (Category)listBox1.SelectedItem;
    byte[] resim = CategoryProcess.GetPicture(cat.CategoryID);
 
    MemoryStream mem = new MemoryStream();
    mem.Write(resim, 78, resim.Length - 78);
    pictureBox1.Image = Image.FromStream(mem);
 
    for (int i = 0; i < 78; i++)
        textBox1.Text += ((char)resim[i]).ToString();
}

Örnek proje.

17 Nisan Cuma, 2009 | C# Ado.Net Sql

Veritabanından Xml'e Dönüştürmece

Şöyle bir düşündüğümüzde veritabınında bulunan herhangi bir tablonun verilerini Xml formatında dosyaya yazmanın kaç yolu vardır acaba? Sabahları genelde işe erken gelirim, 1.5 saat kadar :).
Oturdum bir kaç örnek yaptım, paylaşıyorum tüm dünya ile. (Özgüvenin tavan yaptığı an)

Aklıma gelen ilk yöntem DataTable nesnesini kullanmak. Bu nesneyi sadece yazmak için kullanmak kaynak tüketimi açısından çok iyi bir seçim olmaz fakat kullanım kolaylığı açısında tercih edilebilir.

DataBase 2 Xml
 

Diğer bir yöntem ise henüz Veri KatmanındaDataLayer iken oracıkta Xml formatına dönüştürüp XmlTextWriter ile cayır cayır yazmak.

DataBase 2 Xml

Son yöntem ise daha önce şu yazıda kullandığım teknik ile (attributenitelik yerine bu sefer nodedüğüm kullandım) XDocument ile manuel olarak Xml dosyasını oluşturmak. Sanırım en zoru bu. Yanlış anlaşılmasın benim için kolay da hani ilk yapan için diyorum :)

DataBase 2 Xml

20 Kasım Perşembe, 2008 | Asp.net C# Xml Linq Ado.Net Sql

Sql Server Management Studio Item Foreground

Visual Studio ile kodlama yaparken sayısal ifadeleri farklı bir renk ile vurgulamayı adet edinmişimdir. Bu şekilde kodu okumak daha pratik gelmiştir bana. Kod örneklerimden de bunu farketmek mümkün. Sql Server 2005 Management Studio ile değil ama 2008 ile aynı vurguyu yapmak mümkün olabiliyor. Nihayet :)

Peki nasıl yapıyorum;
Sql Server 2008 Management Studio uygulamasını açıyoruz. Tools -> Options -> Environment -> Fonts and Colors altında Display items altında ki Number seçeneğini tıklıyoruz. Item Foreground özelliğini Purple yada tercih ettiğimiz bir rengi seçiyoruz.

Sql Font Setting

Örnek:
Sql Font Color

23 Ekim Perşembe, 2008 | Sql

Veritabından Resim Göstermek

Öğrencilerimin en sık sorduğu sorulardan biri de, veritabanında depolanmış resimleri web sayfasında nasıl gösterildiğidir. Internette bu konu hakkında zilyon tane yazı olmasına karşın bir tane yazma gereği hissettim.

Öncelikle anlaşılması gereken konu, html sayfalarında resim göstermenin ilk koşulu resmin fiziksel yolunun kontrole yada etikettage aktarılmasıdır.
Örneğin;

image

Diğer taraftan baktığımızda ki bu taraf veritabanı tarafıdır, resim gibi içeriklerin hangi tip veri alanında saklanacağıdır.
C# ile yazılım geliştiryorsanız resim yada bir dosya serileştiğinde (yani veritabına yazıldığında) byte dizisinden (byte[]) ibaret olacaktır. Bu durumda en uygun alan tipi varbinarybyte[] olsa iyi olur. :)

Kaçınılması gereken davranışlar.

eval

yada

reader

hiç olmadı :)

executescalar

Peki yapılması gereken nedir? Veritabınından okunan byte dizisini resim formatında dışarı aktaracak (response) bir dosya (aspx,ashx) oluşturmak ve oluşan dosyanın yolunu resmi gösterecek kontrol yada etikete atamaktır.

Binary Picture

Örnek tabloda gösterildiği gibi resim UrunResim alanında varbinarybyte[] olarak saklanıyor.

Binary Table

Resmi oluşturacak resim.aspx sayfasına gönderilen parametre değeri ile veritabanında basit bir sorgu yapılarak ve sonucu byte dizisi olarak elde edilir.

sql

Son olarak ise sayfa çıktısının resim olacağını işaret eder ve çıktıyı BinaryWriter metotu ile oluştururuz.

9 Ağustos Cumartesi, 2008 | Asp.net C# Ado.Net Sql