veritabanı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
veritabanı 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.

29 Ekim 2008 Çarşamba

ASP.NET de Image'e Veritabanından Resim Yüklemek

Web sitelerinde genellikle Image kontrollerine yüklemek istediğimiz resimler server’da dosya sisteminden çekilir.

Image1.ImageUrl = "C:Resim.jpg";

gibi bir kod parçasıyla istediğimiz resmi yükleriz. Ama bazen resimlerimizi veritabanında tutuyor olup oradan dinamik olarak yüklememiz gerekebilir. (Dynamically load image to Image control from database with Asp.NET) Böyle bir durumda doğrudan atama yapamayız. Ama şu şekilde bir çözüm bulabiliriz.

İlk olarak Default.aspx sayfasını açalım ve bir dynamicImage adlı bir Image kontrolü ekleyelim. Daha sonra yeni bir sayfa ekleyelim ve adını DynamicallyLoadImage.aspx olarak verelim. Eklediğimiz Image kontrolünün ImageUrl özelliğine DynamicallyLoadImage.aspx?ImageID=1 değerini verelim. Default.aspx sayfamızın kodları aşağıdaki gibidir.

Default.aspx



Ve yapacağımız ikinci şey ise DynamicallyLoadImage.aspx.cs dosyasına aşağıdaki kodları yazmak.

using System.Data.OracleClient;
public partial class DynamicallyLoadImage: System.Web.UI.Page {
 protected void Page_Load(object sender, EventArgs e) {
  DataTable dTable = new DataTable();
  string sql = “SELECT ImageData FROM ImageDatabase“;
  sql += “WHERE ImageID = ‘” + Request.QueryString["ImageID"] + ”‘”;
  OracleConnection con = new OracleConnection(“SERVER = (DESCRIPTION = (ADDRESS = “ + “ (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))” +  “ (CONNECT_DATA = (SERVICE_NAME = XE)));“ +  “uid = TAYFUN; pwd = TT123;”);
  OracleDataAdapter adp = new OracleDataAdapter(sql, con);
  adp.Fill(dTable);
  byte[] ImageData = (byte[])(dTable.Rows[0]["ImageData"]);
  try {
   Response.ContentType = “image / jpeg”;
   Response.BinaryWrite(ImageData);
  } catch {
   Response.Write(“Resim Bulunamadı”);
  }
 }
}

İlk olarak, ben Oracle veritabanı kullanmıştım, ama SQL Server kullanılırsa da bir şey fark etmez. İkinci olarak da ben sadece jpeg veya jpg uzantılı resimler için yaptım, farklı bir uzantı gelirse hata verecektir. Dilerseniz uzantıyı da veritabanında kaydederek herhangi bir uzantıya sahip resim için bunu yapabilirsiniz.

Resimlerin veritabanında tutulması güvenlik açısından iyidir, ama performans açısından iyi değildir. Resimleri dosya sisteminde tutup veritabanında da adresini tutarsanız programcılık mantığına daha uygun bir yapı oluşturmuş olursunuz.

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.

9 Ağustos 2007 Perşembe

MDI Formlarda Parent Formun Arka Planını Değiştirme

Bu yazımda MDI formlarda parent formun arkaplan rengini değiştirmeyi anlatmaya çalışacağım. Eminim ki birçoğunuz parent formun arkaplan rengini ve ya resmini değiştirmeyi properties penceresinde ve kod tarafında denedi ama muhtemelen olmadı. Yaptığım bir projede bunu kullanmam gerekmişti. Aşağıdaki kodların işe yaramadığını görmüş olabilirsiniz. (Visual Studio .Net 2005’te öyle)

this.BackgroundImage = Image.FromFile("C:\\Resim.jpg");
this.BackColor = Color.Blue;

Ben yaptığım projede bazılarınızın da aklına geldiği gibi kalıtım kullandım. Ama kalıtımda da yukarıdaki kodları doğrudan yazınca (sadece renk değiştirmede) işe yaramıyor. Bunun için uyguladığım yöntemi kodları kısaltıp size aktarmak istiyorum.

İlk olarak MdiBackGround isimli yeni bir Windows projesi oluşturalım. Ve Form1’in kodlarını aşağıdaki gibi yazalım. (Form1 miras alınacak sınıf olarak kullanılacak)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace MdiBackGround {
 public partial class Form1: Form {
  public Form1() {
   InitializeComponent();
  }
  protected override void OnPaint(PaintEventArgs e) {
   //if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
   PaintBackground(e.Graphics);
  }
  [DefaultValue(false)]
  public new bool IsMdiContainer {
   get {
    return base.IsMdiContainer;
   }
   set {
    base.IsMdiContainer = value;
    if (!value) return;
    for (int i = 0; i < this.Controls.Count; i++) {
     MdiClient mdiClient = this.Controls[i] as MdiClient;
     if (mdiClient != null) {
      mdiClient.Paint += new PaintEventHandler(this.MdiClient_Paint);
      break;
     }
    }
   }
  }
  private void MdiClient_Paint(object sender, PaintEventArgs e) {
   //if (!DesignMode)//eğer tasarım anında hata olursa bunu aktifleştirin.
   PaintBackground(e.Graphics);
  }
  private void PaintBackground(Graphics g) {
   //this.BackgroundImage = Image.FromFile("C:\\Resim.jpg");
   //Burada doğrudan bu yazılınca çalışıyor.
   Rectangle rect = this.ClientRectangle;
   rect.Inflate(2, 2);
   SolidBrush sb = new SolidBrush(Color.Blue);
   g.FillRectangle(sb, rect);
   sb.Dispose();
  }
 }
}
Related Posts Plugin for WordPress, Blogger...