18 Ekim 2008 Cumartesi

SQL Server'da Veritabanı Tablo Bilgilerini Listelemek

Bu yazımda sizlere MS SQL Server’da oluşturduğumuz bir veritabanının içindeki tabloları ve seçtiğimiz bir tablonun içindeki alanları listeleyen bir program yazacağım.

Her şeyden önce böyle bir şeye neden ihtiyacımız olur onu anlatmaya çalışayım. Diyelim ki Microsoft’un sorgu oluşturma arayüzü olan SQL Server Management Studio’daki Query Builder’i ya da piyasadaki diğer programları beğenmiyorsunuz.(Ben böyle bir şey demedim :P) Ya da kendinize ait bir Query Builder yapmak istiyorsunuz. O zaman böyle bir şeye ihtiyacınız düşecektir. Staj yaptığım yerde benden böyle bir şey yapmam istenmişti. Ben ORACLE ile yapmıştım ama arada hiçbir fark yok. Tek değişen sorgu cümleleri. Server’a uygun sorguyu gönderdikten sonra size sadece verileri düzenlemek kalıyor.

Programda iki adet DataGridView olacak. Birincisinde veritabanındaki tablolar listelenecek, ikincisinde ise birincide seçilen tabloya ait alanlar listelenecek. Aşağıdaki kodları programımıza ekleyelim.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace TabloIslemleriSQL
{
public partial class Form1 : Form
{
   public Form1()
   {
    InitializeComponent();
   }

   string conStr = "DATA SOURCE=.; INITIAL CATALOG = veritabani;
     USER ID = tayfun; PASSWORD = tayfun; INTEGRATED SECURITY = TRUE";
   SqlDataAdapter adp;
   DataTable dt;
   SqlConnection sqlCon;

   private void Form1_Load(object sender, EventArgs e)
   {
    try
    {
     dt = new DataTable();
     string sorgu = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_TYPE =‘BASE TABLE’ AND TABLE_NAME != ’sysdiagrams’";
     sqlCon = new SqlConnection(conStr);
     adp = new SqlDataAdapter(sorgu, sqlCon);
     adp.Fill(dt);
     dgrdTablolar.DataSource = dt;
    }
    catch { }
   }
   private void dgrdTablolar_SelectionChanged(object sender,
     EventArgs e)
   {
    try
    {
     dt = new DataTable();
     string tabloAdi = dgrdTablolar.CurrentRow.Cells[0]
       .Value.ToString();
     string sorgu = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA
       .COLUMNS WHERE TABLE_NAME = ‘" + tabloAdi + "’";
     adp = new SqlDataAdapter(sorgu, sqlCon);
     adp.Fill(dt);
     dgrdAlanlar.DataSource = dt;
    }
    catch { }
   }
}
}

İlk olarak ConnectioString, DataAdapter, DataTable tanımlıyoruz. Ben daha önce oluşturduğum veritabanını seçtim. Form load olayında yazdığımız sorguya göre veritabanımızdaki tablolar listeleniyor.
Tablo isimlerini “INFORMATION_SCHEMA.TABLES” içinden çekiyoruz. Sorguda “TABLE_NAME” ile tablolar listeleniyor, “BASE TABLE” veritabanımızdaki tabloları diğer nesnelerden (View gibi nesneler) ayırıyoruz. Ve ayrıca tablo olarak görünen sistem diyagramları tablosundan (sysdiagrams) ayırıyoruz. Sorguyu çektiğimizde gelen verileri dgrdTablolar DataGridView’ine kaydediyoruz.

dgrdTablolar’ın SelectedChanged olayında seçilen tabloya ait alanların listelenmesi için gönderdiğimiz sorguda tablo adını vermemiz yeterli. Tablo alanlarını “INFORMATION_SCHEMA.COLUMNS” içinden çekiyoruz. Ve gelen verileri dgrdAlanlar DataGridview’ine kaydediyoruz.

Sorgularda “*” yazarak veri çekmemiz durumunda hangi verileri çekebileceğimizi görürüz. Örneğin “COLUMN_NAME” yanında “DATA_TYPE” yazarak alanın veri tipini de çekebiliriz.

Oracle’daki Sorgular

Oracle’da MS SQL Server’dan farklı olarak veritabanı yerine şemalar var, “SCHEME” olarak geçiyor. Tablo isimlerini ve alan isimlerini listeleyen sorgular aşağıdaki gibidir:

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = ‘veritabani’ SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE OWNER = ‘veritabani’ AND TABLE_NAME = ‘TABLOADI’

Burada “OWNER” ile şema (veritabanı) ismi veriliyor.

Gördüğünüz doğru sorgu cümlelerini bulduktan sonra yapamayacağımız bir şey yok. Şöyle ki; kullanıcının sistem zamanını değiştirmesi olasılığına karşı Server’dan sistem zamanını çekmek istiyorsunuz. Bunu;

SELECT GETDATE() AS [Tarih Ve Saat]

Sorgusuyla yapabilirsiniz. Böylelikle muhtemel bir hatanın önüne geçebilirsiniz.

Bu yazımda size hazırladığımız veritabanlarının, tablolarının ve alanlarının isimlerini listeleme hakkında bilgi vermeye çalıştım. Sormak istediğiniz bir şey varsa bana mail atabilir ya da bu yazı için yorum yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder

Related Posts Plugin for WordPress, Blogger...