Veritabanında Xml'e dönüştürmece

sprt 20, Kasım 2008

Şöyle bir düşündüğümüzde veritabınında bulunan herhangi bir tablonun verilerini Xml biçiminde 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.

using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True;"))
{
   cn.Open();
   using (SqlDataReader rd = new SqlCommand("select ProductID,ProductName,UnitPrice,UnitsInStock from Products order by ProductName"
, cn).ExecuteReader())
   {
      //en temizi bu gibi
      DataTable dt = new DataTable("Product"
);
      dt.Load(rd);
      dt.WriteXml(Server.MapPath("Products_dataTable.xml"
));
   }
}

Diğer bir yöntem ise henüz Veri Katmanında (DataLayer) iken oracıkta xml formatına dönüştürüp XmlTextWrite ile cayır cayır yazmak.

using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True;"))
{
   cn.Open();
   using (SqlDataReader rd = new SqlCommand("select ProductID,ProductName,UnitPrice,UnitsInStock from Products order by ProductName for xml raw('Product'),elements,root('Products')"
, cn).ExecuteReader())
   {
      using (XmlTextWriter xt = new XmlTextWriter(Server.MapPath("Products_Direct.xml"), Encoding
.UTF8))
      {
         //buda temiz gibi ama sorgusu farklı sanki
         xt.WriteStartDocument();
         string xmlData = string
.Empty;
         while
(rd.Read())
         xt.WriteRaw(rd[0
].ToString());
      }
   }
}


Son yöntem ise daha önce şu yazıda kullandığım teknik ile (attribute yerine bu sefer node 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.

northwindDataSourceDataContext db = new northwindDataSourceDataContext();
//buda hiç kolay değilmiş doğrusu
XDocument xdoc = new XDocument
(
new XDeclaration("1.0", "utf-8", "yes"
),
   new XElement("Products"
,
   from p in
db.Products
   orderby
p.ProductName
   select
      new XElement("Product"
,
         new XElement("ProductID"
, p.ProductID),
         new XElement("ProductName"
, p.ProductName),
         new XElement("UnitPrice"
, p.UnitPrice),
         new XElement("UnitsInStock"
, p.UnitsInStock)
)));
xdoc.Save(Server.MapPath("Products_linq.xml"
));

Yorumlar

Generate Sample XML

sprt 5, Kasım 2008

Uzun zamandır Strong Type DataSet kullanmadığımdan basit bir uygulama yazmak belki bir kaç yenilik varsa da görmek istedim. Dataset içine basit birkaç data girebileceğim DataTable ekledim. Sql Server ile uğraşmamak için data kaynağı olarak xml' i uygun gördüm. Daha sonra aklıma keşke içi dolu bir xml dosyası olasa da test işlemlerini hemen yapsam.
Visual Studio 2008 kullanıyorsanız eğer Xml Schema Explorer penceresini bilirsiniz. O pencerede DataTable' a sağ tıklarsanız tam aradığım şey ile karşılaşırsınız.

Generate Sample XML


Sonuç;
<?xml version="1.0" encoding="utf-8"?>
<
mailData xmlns="http://tempuri.org/mailData.xsd"
>
   <
Mail
>
      <
mailID>1</mailID
>
      <
senderID>senderID1</senderID
>
      <
sender>sender1</sender
>
      <
subject>subject1</subject
>
      <
message>message1</message
>
      <
date>1900-01-01T01:01:01+02:00</date
>
      <
stat>true</stat
>
   </
Mail
>
   <
Mail
>
      <
mailID>-2147483647</mailID
>
      <
senderID>senderID2</senderID
>
      <
sender>sender2</sender
>
      <
subject>subject2</subject
>
      <
message>message2</message
>
      <
date>0001-01-01T00:00:00+02:00</date
>
      <
stat>false</stat
>
   </
Mail
>
   <
Mail
>
      <
mailID>2147483647</mailID
>
      <
senderID>senderID3</senderID
>
      <
sender>sender3</sender
>
      <
subject>subject3</subject
>
      <
message>message3</message
>
      <
date>9999-12-31T23:59:59.9999999+02:00</date
>
      <
stat>true</stat
>
   </
Mail
>
</
mailData
>


Yorumlar

Sql Server Management Studio Item foreground

sprt 23, Ekim 2008

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.

Örnek:
use northwind
go
select
ProductID,ProductName,UnitPrice
from Products
where UnitsInStock >10 and UnitsInStock <100

Yorumlar

JavaScript ile ContentPlaceHolder içindeki sunucu kontrollerine ulaşmak

sprt 14, Ekim 2008

Web uygulamaları geliştirirken MasterPage kontrolü kullanıldığında içerik sayfalarında kullanılan sunucu kontrolleri istemci tarafında farklı isimlendirilir.
Örneğin, Name özelliği txtAd olan TextBox kontrolünün istemci tarafında aldığı id değeri ctl00_ContentPlaceHolder1_txtAD olacaktır. Bu durumda istemci tarafındaki javascript fonksiyonundan kontrollere erişim çok pratik olmayacaktır.

Şimdi bu durum karşısında nasıl bir tavır takınacağımıza bakalım :)

Örneğimizde, içerik sayfasında bulunan 4 adet TextBox kontrolünün Text özelliğini temizleyen bir javascript fonksiyonumuz olacak.

//aspx
<
asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id
="region1">
   <asp:TextBox ID="txtAD" runat="server"></asp:TextBox
>
   <br
/>
   <asp:TextBox ID="txtSoyad" runat="server"></asp:TextBox
>
   <br
/>
   <asp:TextBox ID="txtDogumTarihi" runat="server"></asp:TextBox
>
   <br
/>
   <input id="btnTemizle" type="button" value="Temizle" onclick="temizle('region1');"
/>
</div
>
</
asp:Content
>

//js
function
temizle(bolge) {
   var elements = document.getElementById(bolge).getElementsByTagName('input');
   var len = elements.length;
   for (var i = 0; i < len; i++) {
      if (elements[i].type == 'text')
         elements[i].value = '';
   }
}

Nasıl ki MasterPage kontrolü, karışıklığı engellemek için kontrollerin id lerine contentplaceholder ekliyorsa, bizde temizlemek istediğimiz kontrolleri, id özelliği region1 olan bir div içinde kullandık.
Daha sonra div içindeki tüm input kontrollerini aldık ve özelliği text olanları temizledik.

Temiz iş :)

Yorumlar

Close' mu Connection Connection' mı Close

sprt 23, Eylül 2008

CloseConnection ne işe yarar neden kullanılır?

Command nesnesinin executeReader metotu ile kullanılan enum olarakta bilinir. Varsayılan değeri Default fakat ihtiyaç gereği 6 adet daha kullanılan değeri mevcuttur ki CloseConnection bunlardan biridir. Command nesnesine bağlı olan Connection nesnesi reader nesnesi kapatılana kadar açık kalır. Neden kalsın ki?

Örnek bir kullanım ile açıklayalım;

public class
dataHelper
{
   //interface ile bağımlılık ortadan kalkıyor
   public IDataReader getDataByReader(string query)
   {
      SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True;");
      SqlCommand cm = new SqlCommand(query,cn);
      cn.Open();
      //Connection açık, reader okunmak için ihtiyaç duyulan nesneye döndürülüyor
      return cm.ExecuteReader(CommandBehavior.CloseConnection);
   }
}

class
Program
{
   static void Main(string[] args)
   {
      dataHelper dap = new dataHelper();
      IDataReader dr = dap.getDataByReader("select * from Categories");
      while (dr.Read())
         Console.WriteLine("{0} - {1}", dr[0], dr[1]);
      //Command nesnesine bağlı connection nesnesi kapanıyor.
      dr.Close();
   }
}

Kazancımıza bakalım;
 - Reader ile okumanın Adapter ile okumaktan daha hızlı olduğunu herkes bilir. + 1
      (Connection nesnesi kapansaydı Reader nesnesi null olarak gelecekti. Açık bırakırsak ayrı bir dert)
 - SqlCommand nesnesini Program nesnesine çekersekte uygulama System.Data.SqlClient' a bağımlı kalacaktı bu da iyi bir tasarım olmayacaktı. + 2

Yorumlar
1 2 3 4  ...