ms sql server etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
ms sql server etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

3 Kasım 2008 Pazartesi

SQL İpuçları

Bu yazımda sizlere SQL hakkında bazı ipuçları vereceğim. SQL gerçekten mükemmel bir dil. Normal bir programlama diliyle yapabildiğimiz her şeyi SQL ile yapabiliyoruz. Veritabanından çektiğimiz verilerin mutlak değerini almak, karekökünü almak, Convert işlemi uygulamak ve bunun gibi birçok işlemi SQL ile yapabiliyoruz.

Bu konu için aslında çoğu programcının başına gelen bir problemden bahsedeyim. Bu problem, SQL Server ile Visual C#.NET’in farklı tarih formatları kullanması ile oluşan bir problemdir. (Bazılarınızın gülümsediğini hissediyorum :)) Bu problem .NET’in tarih formatının "dd.MM.yyyy" olması, SQL Server’in tarih formatının ise "MM.dd.yyyy" olması ile ortaya çıkar. Bunu çözmek için önceden (aslında şimdi de) C#’da

string tarih = DateTime.Now.Month.ToString() + "." + DateTime.Now.Day.ToString() + "." + DateTime.Now.Year.ToString();

string tarih = DateTime.Now.ToString("MM.dd.yyyy");

System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-GB");

string tarih = Convert.ToDateTime(txtTarih.Text, culture);

gibi ifadeler kullanıyordum. Eminim ki birçoğunuz da bunlara benzer şekillerde bir çözümler bulmuştu. Ama bu çözümler SqlDataSource’da otomatik olarak oluşturduğumuz update ve insert cümlelerinde pek fazla işe yaramaz. (Tabi siz insert ve update alanlarını TemplateField olarak ayarlayıp kod tarafında işlem yapmak isterseniz bunları kullanabilirsiniz) Bu sorunun SQL ile çözümü ise

INSERT INTO TABLO(kisi, tarih) VALUES(@kisi, CONVERT(datetime, @tarih, 103))

şeklindedir. Burada CONVERT() fonksiyonu, gelen parametreyi herhangi bir SQL veri tipine çevirmemize yarar. 103 ise "dd/MM/yyyy" tarih formatını belirtmemize yarar. Bu kısma 108 girdiğimizde saat değerini elde ederiz. ("HH.mm.ss") Biz burada SQL Server’a hangi formatta veri gönderdiğimizi belirtiyoruz. O da hangi formatta olduğunu anlayıp o şekilde işlem yapıyor. Eğer formatını belirtmezsek

“The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.The statement has been terminated.”

gibi bir hata ile karşılaşırız.
Tarih formatlamanın Oracle’daki karşılığı ise TO_DATE() fonksiyonudur. Bu şekilde girilen bilgiyi tarih bilgisine dönüştürüp Oracle’a kaydedebilirsiniz. Ayrıca Oracle’da tarihe göre arama yapabilmek için bu fonksiyonu kullanmak zorundasınızdır. Kullanılışı ise

TO_DATE(@tarih, 'dd.MM.yyyy')

şeklindedir.

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 { }
   }
}
}

19 Mart 2008 Çarşamba

SQL Server Express 2005'te 4GB Denemesi

SQL Server Express'de geçenlerde 4 GB sınırını test ettim. Bir deneme veritabanı oluşturp nchar(50) veritipinde 25 sütunu olan bir tablo oluşturdum. Ve bu tabloya T-SQL döngüsüyle tam olarak 1571906 adet veri kaydettim. Bu kadar veriyi bir kerede kaydetmek mümkün değil tabiki. Veritabanının sınırları 4 GB'yi bulunca

"Could not allocate space for object 'dbo.denemeTablo' in database 'deneme' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup."

hatasını veriyor. Ve "Shrink Database" komutuyla veritabanını sıkıştırıp tekrar ekleme yaptım. Bu işlemi birkaç kez yaptıktan sonra kayıt sayısı en son buna ulaştı.

SQL Server Express'deki diğer kısıtları buradan öğrenebilirsiniz.
Related Posts Plugin for WordPress, Blogger...