Makale Özeti

Bu makalemde hepimizin veritabanı uygulaması geliştirirken karşılaştığı genel bir soruna çözüm sunmaya çalışacağım.Aslında buna işin angaryasını ortadan kaldırmak diyebiliriz.Geliştirdiğimiz veritabanı uygulamalarında en çok tekrarladığımız şey veritabanında bulunan bir tablo'ya veri göndermek ve okumak.Baz anlamda bu işleri sıralarsak;

Makale

Tüm yazılımcı arkadaşlara selamlar,

Bu makalemde hepimizin veritabanı uygulaması geliştirirken karşılaştığı genel bir soruna çözüm sunmaya çalışacağım.Aslında buna işin angaryasını ortadan kaldırmak diyebiliriz.Geliştirdiğimiz veritabanı uygulamalarında en çok tekrarladığımız şey veritabanında bulunan bir tablo'ya veri göndermek ve okumak.Baz anlamda bu işleri sıralarsak;

  • Okuma/Kriterlere göre arama
  • Saklama/Güncelleme
  • Silme

.Net ile bu işlemleri sqlconnection sqlcommand dataset vs. gibi nesnelerle gerçekleştirebiliyoruz.Asıl sorun, tablo sayısı çoğaldığında ,proje büyüdüğünde ve dağınık projelerde birden fazla form nesnesinde veritabanına erişmek zorunda kaldığımızda karşımıza çıkıyor.

Problemin detaylarına inmeden önce projemizde kullanacağımız örneğimizi hazırlayalım.

Bir senaryo yaratalım.Bir şirketin görev yönetimi sistemini geliştirdiğimizi düşünelim.Kullanıcı kimlik bilgilerinin ve görev bilgilerinin tutulduğu iki tablo yaratalım.Ayrıca bu tablolara ait bilgilerin kaydedilmesi ve silinmesi için Stored Procedure ler yaratalım.

USR_TBL (Kullanıcı kimlik bilgilerinin tutulduğu tablo)
USE [TestDatabase]
GO
/****** Object: Table [dbo].[USR_TBL] Script Date: 09/08/2006 23:45:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[USR_TBL](
[USR_ID] [int] IDENTITY(1,1) NOT NULL,
[USR_NAME] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
[USR_SURNAME] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
[USR_PASS] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
CONSTRAINT [PK_USR_TBL] PRIMARY KEY CLUSTERED 
(
[USR_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

TSK_TBL (Görev bilgilerinin tutulduğu tablo)
USE [TestDatabase]
GO
/****** Object: Table [dbo].[TSK_TBL] Script Date: 09/08/2006 23:53:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TSK_TBL](
[TSK_ID] [int] IDENTITY(1,1) NOT NULL,
[TSK_USRID] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
[TSK_SUBJECT] [varchar](50) COLLATE Turkish_CI_AS NOT NULL,
[TSK_DESC] [text] COLLATE Turkish_CI_AS NOT NULL,
[TSK_DATE] [datetime] NOT NULL,
CONSTRAINT [PK_TSK_TBL] PRIMARY KEY CLUSTERED 
(
[TSK_ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF

SP_USR_SAVE/DELETE (USR_TBL tablosuna ait saklama ve silme SP leri)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE SP_USR_SAVE
    @USR_ID INT,
    @USR_NAME VARCHAR(50),
    @USR_SURNAME VARCHAR(50),
    @USR_PASS VARCHAR(50) OUTPUT
AS
    BEGIN
        SET NOCOUNT ON;
        IF @USR_ID=0
            BEGIN
                INSERT
                    USR_TBL
                VALUES
                    (
                    @USR_NAME,
                    @USR_SURNAME,
                    @USR_PASS
                    )
            END
        ELSE
            BEGIN
                UPDATE
                    USR_TBL
                SET
                    USR_NAME=@USR_NAME,
                    USR_SURNAME=@USR_SURNAME,
                    USR_PASS=@USR_PASS
                WHERE
                    USR_ID=@USR_ID
            END
    END
GO

//---------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE SP_USR_DELETE
    @USR_ID INT
AS
    BEGIN
        SET NOCOUNT ON;

        DELETE FROM
            USR_TBL
        WHERE
            USR_ID=@USR_ID
    END
GO

SP_TSK_SAVE/DELETE (TSK_TBL tablosuna ait saklama ve silme SP leri)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE SP_TSK_SAVE 
    @TSK_ID INT,
    @TSK_USRID INT,
    @TSK_SUBJECT VARCHAR(50),
    @TSK_DESC TEXT,
    @TSK_DATE DATETIME
AS
BEGIN
    SET NOCOUNT ON;

    IF @TSK_ID=0
        BEGIN
            INSERT
                TSK_TBL
            VALUES
                (
                @TSK_USRID,
                @TSK_SUBJECT,
                @TSK_DESC,
                @TSK_DATE
                )
        END
    ELSE
        BEGIN
            UPDATE
                TSK_TBL
            SET
                TSK_USRID=@TSK_USRID,
                TSK_SUBJECT=@TSK_SUBJECT,
                TSK_DESC=@TSK_DESC,
                TSK_DATE=@TSK_DATE
            WHERE
                TSK_ID=@TSK_ID
        END
END
GO

//---------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE SP_TSK_DELETE
    @TSK_ID INT
AS
    BEGIN
        SET NOCOUNT ON;

        DELETE FROM
            TSK_TBL
        WHERE
            TSK_ID=@TSK_ID
    END
GO

Sonuç itibariyle tablolarımız aşağıdaki gibi gözükecektir.

Resim 1 - Kullanıcı kimlik ve Görev bilgilerinin tutulduğu tablolar.

Yukarıdaki yapıya ulaşıp kullanıcı kayıtlarını veritabanından okumak istediğimizde aşağıdaki kodu yazıyoruz.

SqlConnection conSQL=new SqlConnection(@"Data Source=IT001\SQLEXPRESS;Initial Catalog=TestDatabase;Integrated Security=True");
SqlCommand comSQL = new SqlCommand("Select * from USR_TBL", conSQL);
conSQL.Open(); 
SqlDataReader drdSQL = comSQL.ExecuteReader(CommandBehavior.CloseConnection);
DataSet dsSQL = new DataSet();
dsSQL.Load(drdSQL, LoadOption.OverwriteChanges, new string[] { "USR_TBL" });

dataGridView1.DataSource = dsSQL;
dataGridView1.DataMember = "USR_TBL";

Fakat projenin diğer kısımlarında da aynı şekilde veri okumamız gerektiğinde aynı kodu kullanmak zorunda kalıyoruz.Tablo yapısının değişmesi gibi durumlarda ise bütün projeyi araştırıp güncelleme yapmamız gerekiyor ki bu geliştirme zamanını artırıyor ayrıca hata riskini de yükseltiyor.

Çözüm olarak n-tier modelini uygulamamız bizi veriye ulaşım'ın tek noktadan yapılmasını sağlar fakat büyük çaplı projelerde modüllerin veya yeni tabloların eklenmesi tekrar bizim her tablo için ayrıca kod yazmamızı gerektirir.

Bu noktada çözüm üretebilmemiz için standardizasyona gitmemiz gerekmektedir.Yeni oluşturulan tablolara kayıt eklemek için minimum kod yazımını gerçekleştirmemiz gerekecektir.

Peki bunu nasıl yapacağız?


Levent YILDIZ
theone@leventyildiz.net
msmoracle@hotmail.com