TSQL de birbirinden virgülle ayrılmış string listelerini ayrıştırmak arada sırada ihtiyaç duyduğumuz bir kullanım şeklidir. Normal koşullarda, ilişkili database modelinde böyle bir durum ile karşılaşılmaz.

Bazen Sql programcıları çift değerli sütün yâda değişken kullanma gereksinimi ile karşı karşıya kalırlar( genelliklede veri başka bir yerden geldiğinde). TSql de liste ya da dizi tiplerini destekleyen yerleşik bir yapı olmadığı için, çift değerleri bir araya getirmek de genellikle delimited VARCHAR strings kullanılır. İlişkideki bir öznitelik sadece süzülmüş uygun bir tipe sahip olabildiğinden beri hepimizin bildiği gibi çift değerleri tek bir sütunda tutmak ilişkili modelin temel kuralıdır.

SQL tabloları doğası gereği çift değerli sütunlara izin vermez. Bu XML veri tipleri ortaya çıkmadan önce mantıklı bir yapı idi. Programcılar ara sıra değişen başarı dereceleri ile bu kuralı eziyorlardı. Kullanıcılar daima virgül ya da boşluk gibi bir karakterle ayrılmış daha küçük stringlerin bir kombinasyonu olan tek bir string yorumlamak zorunda kalabilirler. Programcılar bu nedenle, var olan string fonksiyonlarının gücünden faydalanarak, birleştirilmiş stringlerden istediği kadar küçük parçaları söküp çıkartabilirler.

Burada önerilen methodlar sadece eksiliği gidermek için kullanılmalı, üretim sistemleri için önerilmez. Eğer ürün kılavuzunda dökümanta edilmemiş bir method kullanıyorsan, onları doğruca ikaz et ve konu ile ilgili bütün uyarıları yapın.

Göz önüne alınması gerekenler:

Bir diziyi parse eden ve veri yönetimi sağlayan çoğu method veriyi tabloya çift satırmış gibi eklemek için kullanılabilir. Sonraki kısımda anlatılacaklar: bir kullanma şekli tanımlamak ve bir değişkende, parametrede ya da hatta column değeri gibi tanımlanan stringdeki altbölümleri bir tabloya kaydetmek. Örnekler virgülle ayrılmış listelerdir.Genel olarak bilinen değerleri   ‘item- 1,item-2,item-3….item-n’ olan CSV Gibi.

Pratikte, stringleri ayırmak için herhangi bir karakteri kullanabilirsin space de dahil olmak üzere methodları karaktere göre uyarlayabilirsin. Aşağıdaki örnekte, Northwind database inde Customer tablosundan rastgele birkaç müşteri tanımı seçilmiş. Aşağıdaki her bir örnek için bu listeyi kullanacağız.

DECLARE @p VARCHAR(50)
SET @p = ‘ALFKI, LILAS, PERIC, HUNGC, SAVEA, SPLIR, LONEP, GROSR’

Direk Data karşılaştırması:

Basit karşılaştırmalar için, karmaşık alışılmış kullanımlara gerek yok. TSQL içinde içsel eşleştirme kalıplarını içeren özellikler çoğu koşulda direk olarak kullanılabilir.

Bir ilk olarak örnek değerler listesinden seçmek ve onu WHERE koşulundaki IN listesinde kullanmak. Aşağıda bazı genel methodlar:

CHARINDEX() fonksiyonunu kullanma:

Expression2 içinde expression1 arar ve eğer bulursa başlangıç pozisyonunu döndürür. Arama start_location dan başlar.

CHARINDEX ( expression1, expression2 [ , start_location ] )

SELECT CustomerID, ContactName, CompanyName
FROM Northwind.dbo.Customers
WHERE CHARINDEX( ‘,’ + CustomerID + ‘,’, ‘,’ + @p + ‘,’ ) > 0 ;

CustomerID ContactName                    CompanyName
———- —————————— ——————————
ALFKI      Maria Anders                   Alfreds Futterkiste
GROSR      Manuel Pereira                 GROSELLA-Restaurante
HUNGC      Yoshi Latimer                  Hungry Coyote Import Store
LILAS      Carlos González                LILA-Supermercado
LONEP      Fran Wilson                    Lonesome Pine Restaurant
PERIC      Guillermo Fernández            Pericles Comidas clásicas
SAVEA      Jose Pavarotti                 Save-a-lot Markets
SPLIR      Art Braunschweiger             Split Rail Beer & Ale

Geliştirmekte olduğumuz uygulamalarımızda bir takım olaylar vardır ki, birbirine bağımlıdır ve bir bütün olarak hareket etmelidirler. Bu tarz küçük parçalara ayrılamayan işlemlere transaction denir. İşlemlerin tamamı gerçekleşmediği sürece tekil olarak çalışan işlemler çalışmamış kabul edilir. Bir örnek vermek gerekirse , geliştirdiğiniz uygulama bir bankanın internet şubesine yönelik ise, döviz bozdurma işlemi bir müştiriden döviz alımı yapıldığında dövizin miktarı kadar kasadaki döviz miktarını aktarmalı ve dövizin miktarına tekabül eden YTL kasadan düşülmelidir. Bu işlem yapılırken kişinin hesabına YTL aktarımı yapıldıktan sonra eğer bir problem olursa ve bu işlemleri birbirine bağımlı hale getirmez isek dövizde müşteride kalır yada tam terside olabilir.

bu işlemi uygulamızdaki stored procedure de :

BEGIN TRANSACTION

UPDATE tblYtlHesap

SET bakiye=bakiye + @dovizMiktari*@dovizKuru

WHERE hesapNo=@musteriHesapno

IF @@ERROR<>0

ROLLBACK

RETURN 0

UPDATE tblDovizHesap

SET bakiye=bakiye - @dovizMiktari

WHERE hesapNo=@musteriHesapno

IF @@ERROR<>0

ROLLBACK

RETURN 0

COMMIT

RETURN 1

SQL serverin sağladığı 3 farklı transaction vardır.

1- Auto Commit : eğer herhangi bir mod belirlenmedi ise standart olarak gelen türdürç

2 – Harici(Explicit) Transaction : kullanıcı tarafından begin tran ile başladıtılıp commit ve rollback işlemlerini belirlediğimiz moddur.

3- Dahili(Implict) Transaction : belirli ifadelerde otomatik olarak transaction başlamasını sağlar fakat, rollback ve commit işlemlerini bizim yapmamız gerekir.

 

SQL Server 2005 Transact-SQL sonuç kümende sıralama yapmanı sağlayacak  fonksiyonlar içerir. Bu fonksiyonlardan bir veya daha fazlasını sorgunuzun SELECT cümleciğine eklediğinizde, kullandığınız fonksiyona göre  her satır için bir sıralama atamış olursunuz.

T-SQL şimdilik 4 tane sıralama fonksiyonu içerir : ROW_NUMBER, RANK, DENSE_RANK ve NTILE. Şimdi kısaca bu fonksiyonların tanımı yapacak ve nasıl çalıştıklarını göstereceğim.

Sıralama Fonksiyonlarının  Genel  Yazımı:

ROW_NUMBER ( ) ,RANK(),DENSE_RANK(),NTILE()    OVER ( [ <partition_by_clause> ] <order_by_clause> )

 

<partition_by_clause>

FROM cümleciği tarafından üretilen sonuç kümelerinde, sıralama fonksiyonunun uygulanacağı bölümleri  belirler.

<order_by_clause>

ORDER BY bir bölüm içindeki sıralamanın hangi sütuna göre yapılacağını belirler.

 

DECLARE @Tablo Table

(ID int identity,  SoyAd varchar(100),SatisPayi int,Ay varchar(30),Yil int)

 

insert into @Tablo values(‘A’,280000,‘Ocak’,2002)

insert into @Tablo values(‘B’,280000,‘Ocak’,2004)

insert into @Tablo values(‘A’,267000,‘Nisan’,2002)

insert into @Tablo values(‘B’,266000,‘Ocak’,2002)

insert into @Tablo values(‘C’,264000,‘Ocak’,2002)

insert into @Tablo values(‘D’,263000,‘Haziran’,2003)

insert into @Tablo values(‘E’,247000,‘Nisan’,2003)

insert into @Tablo values(‘B’,244000,‘Haziran’,2001)

insert into @Tablo values(‘B’,239000,‘Ocak’,2003)

insert into @Tablo values(‘B’,244000,‘Haziran’,2001)

insert into @Tablo values(‘A’,234000,‘Ocak’,2004)

insert into @Tablo values(‘C’,226000,‘Aralýk’,2002)

insert into @Tablo values(‘A’,226000,‘Haziran’,2001)

insert into @Tablo values(‘C’,224000,‘Nisan’,2003)

insert into @Tablo values(‘F’,217000,‘Ocak’,2003)

insert into @Tablo values(‘C’,210000,‘Haziran’,2002)

 

 

 

SELECT

ROW_NUMBER() OVER(ORDER BY SatisPayi DESC) AS [RowNumber],

RANK() OVER(ORDER BY SatisPayi DESC) AS [Rank],

DENSE_RANK() OVER(ORDER BY SatisPayi DESC) AS [DenseRank],

NTILE(5) OVER(ORDER BY SatisPayi DESC) AS [NTile],

SoyAd, SatisPayi, Ay, Yil

FROM @Tablo

 

Örneğimizideki Select deyiminde 4 sıralama fonksiyonunu kullanmakta.Bütün fonksiyonları tek deyimin içine dahil ettim.Böylece her fonksiyonun döndürdüğü sonucu karşılaştırabilirsiniz.

 

 

 

 

 

 

 

 

[RowNumber]

pan style="color: black">[Rank]

[DenseRank]

[NTile]

SoyAd

SatisPayi

Ay

Yil

1

1

1

1

C

264000

Ocak

2002

2

1

1

1

C

226000

Aralık

2002

3

1

1

1

C

224000

Nisan

2003

4

4

2

2

F

217000

Ocak

2003

5

5

3

2

B

280000

Ocak

2004

6

5

3

2

B

266000

Ocak

2002

7

5

3

3

B

244000

Haziran

2001

8

5

3

3

B

239000

Ocak

2003

9

5

3

3

B

244000

Haziran

2001

10

10

4

4

E

247000

Nisan

2003

11

11

5

4

D

263000

Haziran

2003

12

12

6

4

A

226000

Haziran

2001

13

12

6

5

A

234000

Ocak

2004

14

12

6

5

A

280000

Ocak

2002

15

12

6

5

A

267000

Nisan

2002

 

ROW_NUMBER () fonksiyonu

ROW_NUMBER()  fonksiyonu sıralama fonksiyonlarının en kolayıdır. Sizinde sonuç kümesinden görebildiğiniz gibi satırın numarasıdır. Bir satırın bir sonuç kümesinin bir bölümündeki ardışık numarasını döndürür. Her bölüm için ilk satır 1 ile başlar.  Ben bu örnekte SatisPayi sütununa göre sıralama yapıyorum(azalan sırada). Dönen sonuç kümesinde sonuçlar en yüksek SatisPayindan başlıyor.

RANK()  function in SQL Server

Listemdeki diğer sıralama fonksiyonu RANK(). Rank fonksiyonunu kullanıldığı zaman sıralama yaptığın sütundaki aynı değerler aynı sıralama numarasını alacaktır. Fakat sıralama değeri sonuç kümesindeki satırın pozisyonunu baz alır. Örneğin,Üçüncü sıradaki SatisPayi  267,000 en yüksek ikinci değer. Fakat 2.sıra yerine 3 üncü sıraya düşmektedir. RANK fonksiyonu 2 yi atladı çünkü ikinci satır birinci satırla eşleşiyordu. Eğer 4 üncü satırda 3.üncü satırla aynı değeri paylaşsa idi 3 ile sıralanacaktı.

 
   
 

DENSE_RANK()  function

DENSE_RANK  function da, RANK function gibi aynı değerli  sütunlar aynı sıralama değerini alırlar ama ardışık olarak artar. Sonuç kümesinde de görüldüğü gibi 3. Satır 2 sıralama numarasını almıştır çünkü 2. en yüksek SatişPayina sahiptir.

 ROW_NUMBER, RANK ve DENSE_RANK fonksiyonları sonuçları döndürüş türüne göre benzerdir. Fark numaralandırmanın sıralı olup olmadığında ve satıra bağlı olup olmadığındadır. NTILE fonksiyonu üç fonksiyondan farklıdır.

NTILE()  function

NTILE fonksiyonunu kullandığında parametre olarak bir integer vermelisin. NTILE sonuç kümesini verilen parametreye göre böler. Örneğineğimizde parametre olarak 5 verdim. Bu demek ki sonuç 5 grupa bölünecek. 15 satır olduğu için her grup 3 satır içerecek. Gruplar Satis Payina göre değer alacak. En yüksek satis payina sahip 3 satır 1 değerini diğer en yüksek Satis payi 2 değerini alır. Çünkü 5 grup var.

Sizinde gördüğünüz gibi, SQL Serverdaki sıralama fonksiyonları gayet açık. Genelde Matrix raporlarda satır numarası kullanırken çok işime yarıyor.   

Tekrar merhaba.

Önceki makalemde stored procedureler hakkında bir giriş bilgisi
vermiştim ve genel olarak nasıl yazıldığına dair örnekler yapmıştık. Bu
makalede stored procedurelerin c#’ta kullanılması ile ilgili biraz bilgi
vereceğim.

Bildiğiniz gibi normal bir c# uygulaması
yaptığınızda sql’le bağlantı kurmak için bir sqlconnection nesnesi, bir
sqlcommand nesnesi ve duruma göre sqldatareader veya sqldataadapter
nesneleri kullanırız. Bunda da aynı nesneleri kullanacağız. Fakat tek
farklılık sqlcomman nesnesinde olacak.

.


SqlCommand

mycommand= new SqlCommand();

.

mycommand.CommandType
= CommandType.Text             satırını

 

 

mycommand.CommandType
= CommandType.StoredProcedure;  olarak
değiştiriyoruz.

 

Bir de :
mycommand.CommandText = kısmına çift tırnak içinde
storedprocedure’ümüzün adını yazıyoruz.

 

Örneğin:

mycommand.CommandText
= "DENEME_EKLE";

 

Daha sonra da
procedure’ümüzün aldığı nesneleri gönderiyoruz. Şimdi bunu daha
açıklayıcı anlatabilmek için bir örnek yapamk istiyorum.

 

Öncelikle bi
procedure yapalım:

 


CREATE PROCEDURE DENEME_EKLE (@AD NVARCHAR(20),@SOYAD NVARCHAR(20))


AS


INSERT INTO DENEME_TABLO(AD,SOYAD) VALUES(@AD,@SOYAD)


GO

 

Görüldüğü gibi
procedure’ümüz iki tane değer alıyor (ad ve soyad) ve bunları
DENEME_TABLO isimli tablonun AD ve SOYAD sütunlarına ekliyor.

 

Şimdiki aşama
c#’ta bu storedprocer’ü kullanamk için gerekli bağlantıları yapmak. Bu
bağlantıları da bir metot içinde kullanmak istiyorum.

 

 

 


public

void KAYIT(string
ad, string soyad)

    {


SqlConnection

mycon = new
SqlConnection
();

           
SqlCommand mycommand=
new SqlCommand();

           
mycommand.Connection = mycon;

           
mycon.ConnectionString = ………;//
connectionstring buraya yazılmalıdır

           
mycon.Open();

           
mycommand.CommandText = "DENEME_EKLE";

            mycommand.CommandType
= CommandType.StoredProcedure;

           
mycommand.Parameters.Add("@AD",
SqlDbType.NVarChar, 50);

           
mycommand.Parameters["@AD"].Value =
ad;

           
mycommand.Parameters.Add("@SOYAD",
SqlDbType.NVarChar, 50);

            mycommand.Parameters["@SOYAD"].Value
= soyad;

           
mycommand.ExecuteNonQuery();

           
mycon.Close();

    }

 

 

Gördüğünüz gibi KAYIT metodu veritabanındaki
DENEME_EKLE isimli procedure’ü kullanıyor, ad ve soyad isminde iki tane
string parametre alıyor ve geriye değer döndürmüyor.

 

mycommand.Parameters.Add("@AD",
SqlDbType.NVarChar, 50);

mycommand.Parameters["@AD"].Value
= ad;

 

satırları
procedure’ümüzün nesneslerini göndermek için kullanlır.
SqlDbType yazdıktan sonra nokta koyunca
sql’deki parametre tiplerini hepsi görünmektedir(int,datetime gibi).


 


Şimdi burada dikkat etmemiz gereken bir kaç husus var.


 


1-   
storedprocedure’de nesneleri hangi sıraya göre yazdıysak (yani bizim
örnek için önce ad sonra soyad) c#’tan da o sıraya göre tanıtmalıyız.
Yani önce soyad sonra ad parametrelerini gönderemeyiz.


2-   
Veritabanında parametrelerin önüne @ işareti koyduğumuz için c#’ta da  
parametreleri göndermek için  @ işareti kullanmamız gerekir: “@
AD"
gibi


3-   
Parametrelerdeki büyük küçük harf farklılığına dikkat etmeliyiz. Yani
procedure’de @AD olarak tanıttığımız parametreyi c#’ta @ad olarak
gösteremeyiz.

 

 

Şu ana kadarki kısımda veritabanımızda
oluşturduğumuz bir procedure’e nasıl ulaşacağımız gördük. Şimdi eğer bu
procedure değer döndürüyorsa nasıl kullanacağız?

Önceki makalemde stored procedure’lerin nasıl değer döndürdüğünü ve
niçin buna ihtiyaç duyulduğunu anlatmıştım. Şimdi bununla ilgili bir
örnek yapalım:

 

Önce procedure’ümüzü biraz değiştirelim. Aynı ad ve
soyadda başka biri varsa kayıt yapmasın ve geriye 0 değeri döndürsün.
Eğer yoksa kayıt yapsın ve bize 1 değeri döndürsün.

 


CREATE PROCEDURE DENEME_EKLE (@AD NVARCHAR(20),@SOYAD NVARCHAR(20))


AS

Declare @kayitkontrol
int

Declare @SONUC
int

Set @kayitkontrol=select
count(*) from DENEME_TABLO where AD=@AD and SOYAD = @SOYAD

 


if(@kayitkontrol = 0)


begin


INSERT INTO DENEME_TABLO(AD,SOYAD) VALUES(@AD,@SOYAD)


set @SONUC = 1


end

 


else


begin


set @SONUC =0


end

 


return @SONUC


GO

 

 

Sıradaki aşama c#’ta bu procedure’ü kullanmak.
Önceki örnekteki motutu bu procedure’e uygun olarak değiştireceğiz ve
dönüş değerini int olarak belirleyeceğiz

 


public

int KAYIT(string
ad, string soyad)

    {

int sonuc;


SqlConnection

mycon = new
SqlConnection
();

           
SqlCommand mycommand=
new SqlCommand();

           
mycommand.Connection = mycon;

           
mycon.ConnectionString = ………;//
connectionstring buraya yazılmalıdır

            mycon.Open();

           
mycommand.CommandText = "DENEME_EKLE";

           
mycommand.CommandType = CommandType.StoredProcedure;

           
mycommand.Parameters.Add("@AD",
SqlDbType.NVarChar, 50);

           
mycommand.Parameters["@AD"].Value =
ad;

           
mycommand.Parameters.Add("@SOYAD",
SqlDbType.NVarChar, 50);

           
mycommand.Parameters["@SOYAD"].Value =
soyad;

           
mycommand.Parameters.Add("@SONUC",
SqlDbType.Int);

           
mycommand.Parameters["@SONUC"].Direction
= ParameterDirection.ReturnValue;

           
mycommand.ExecuteNonQuery();   

           
sonuc =Convert.ToInt32(mycommand.Parameters["@KONTROL"].Value);

           
mycon.Close();  

           
return sonuc;        

    }

görüldüğü üzere sadece

mycommand.Parameters.Add("@SONUC",
SqlDbType.Int);

           
mycommand.Parameters["@SONUC"].Direction
= ParameterDirection.ReturnValue; ve

sonuc =Convert.ToInt32(mycommand.Parameters["@KONTROL"].Value);

satırlarını
ekledik ve geri dönüş değerini almış olduk.

 

Umarım bu
makale bilgilendirici olmuştur. Her türlü soru ve görüşleriniz için
email adresim



kocakemrah@gmail.com

bir sonraki
makalede görüşmek dileğiyle.

 

Bu ilk yazımda size SQL server’lardaki stored procedure’lerden bahsedeğim. Stored procedureler SQL serverda saklanan, sql ifadelerini barındıran metotlar gibi düşünülebilir. Veritabanı programlamaya ilk başlayanlar sql ifadelerini kullandıkları programlama dilinde yazarlar(c#, vb,…). bu ilk öğrenim için uygundur ancak gerçek hayattaki projelerde sql ifadeleri stored procedurelerde saklanır. Stored procedurler bir kere derlenirler ama programlama dilindeki SQL ifadeleri program her çalıştığında tekrar derlenir ve bu da bir zaman kaybı demektir. Diğer yandan kullandığımız dilde yazdığımız sql ifadelerinin doğru veya yanlış olduğunu o dil anlayamaz, doğru kabul eder ve derleme aşamasında hata meydana gelmez, ama o satır işletileceği zaman yani run time’da hata verir ve bu da programlama açısından kötü bir durumdur. Stored procedureler SQL server’da yaratıldıktan sonra derlenir ve hatalı olup olmadıkları orada anlaşılabilir.

Şimdi basit bir stored procedure örneği yapalım.

Create procedure deneme
As
Select * from denemetablosu
Go

Bu procedure anlaşılacağı gibi veritabanımızdaki denemetablosu isimli tablodan bütün verileri çeker. Sql cümlesini istediğim kadar kompleks hale getirebilriz. Zaten stored procedurelerin amacı karmaşık sql cümlelerini sqlde saklayıp hep onu kullanmamızdır.
SQL Query Analyzerda bu procedure’ü kullanmamız için sadece

deneme

yazıp run tuşuna basmamız yeterli olacaktır. Böylece denemetablosunda ne kadar veri varsa onları görebiliriz.

Stored procedureler metotlar gibi parametre alabilir ve değer döndürebilirler.
Şimdi onunla ilgili basit bir örnek gösterelim

Create procedure deneme(@deneme_ad nvarchar(50),  @ deneme_soyad  nvarchar(50))
As
Select * from denemetablosu where AD=@deneme_ad and SOYAD =@deneme_soyad
Go

Bu örnek veritabanımızda kayıtlı olan denemetablosu isimli tablonun AD ve SOYAD kolonlarını kontrol ettiriyor ve eğer aradığımız ad ve soyadda kayıtlar varsa onların bütün kolonlarını bize gösteriyor.

Bu procedure’ü kullanmak için de procedure’ün adını yazıp yanına alacağı parametreleri çift tırnak içinde yazmamız ve run tuşuna basmamız yeterli olacaktır.

deneme “Emrah”,”Koçak”

bu satır işletildiği zaman bize ad sütununda Emrah ve soyad sütununda Koçak olan bütün verileri gösterir.
Eğer procedure’ümüz sayısal bir değer alıyorsa (int, decimal gibi) o zaman çift tırnağa gerek yoktur.

Şimdi bir de return değeri ile ilgili biraz bilgi vermek istiyorum. Stored procedureler zaten select komutuyla bize verileri getirirler ama bazen return değerine ihtiyaç duyarız. Mesela veritabanına kayıt yapmak istiyoruz ve kullanıcı adını belirleyici özellik olarak atadık yani her kullanıcı adı birbirinden farklı olmalı. Şimdi böyle bir veritabanına veri girmek istiyoruz ve kayıt işleminin olup olmadığını da bilmek istiyoruz diyelim. Burada stored procedurelerin bir özellğinden daha bahsetmek istiyorum, stored procedurelerde diğer dillerdeki gibi if, else, next,count gibi deyimleri de kullanabiliriz ve değişken tanımlayıp onlara değer atayabiliriz. SQL serverlarda değişkenler hep başlarına “@” ifadesi konularak tanımlanır. Şimdi yukarıda anlattığım gibi bir veritabanı için kayıt procedure’ü yazalım. Tablomuzun adı KAYIT olsun. 3 tane kolonu olsun:
KULLANICI_ADI, AD, SOYAD

Create procedure KAYITYAP(@KADI nvarchar(50),
@AD nvarchar(50),
@SOYAD nvarchar(50))
AS

Declare @kayitkontrol int
Declare @sonuc int
Set @kayitkontrol=select count(*) from KAYIT where KULLANCI_ADI=@KADI

if(@kayitkontrol=0)
Begin
insert into KAYIT(KULLANICI_ADI, AD,SOYAD) values (@KADI,@AD,@SOYAD)
set @sonuc=1
end

else
begin
set @sonuc=0
end

return @sonuc
GO

Yukarıdaki procedure’ün ne yaptığını kısaca anlatayım. Öncelikle dışarıda 3 tane değer alıyor kullanıcı adı, ad ve soyad için. Sonra iki tane değişken tanımlıyoruz. Bu değişkenlerden ilki @kayitkontrol, tipi ise integer. Bu değişkeni veritabanında aynı kullanıcı adında kayıt var mı yok mu onun için kullanıyoruz.
select count(*) from KAYIT where KULLANCI_ADI=@KADI
satırı veritabanındaki KAYIT isimli tabloda KULLANCI_ADI sütununda bizim girdiğimiz değerle aynı olan verilerin sayısını getiriyor.
Eğer veritabanında aynı kullanıcı adıyla kayıt yoksa bu değer 0 olarak döner. Kullandığımız if ifadesiyle de eğer bu değer 0 ise o zaman kayıt yap diyoruz.
Kullandığımız ikinci değişken @sonuc ise return değeri olarak kullanılıyor. Tipini integer olarak atadık. Eğer kayıt işlemi yapılırsa 1 değerini atıyoruz yapılamadıysa 0 değerini atayıp döndürüyoruz ve kullandığımız arayüz programı da bu değeri ”kayıt yapıldı” ya da “yapılamadı” gibi kullanıcı tarafından anlamlı olan cümlelere dönüştürür. Bu işlem tabi ki çok çeşitli şekillerde de yazılabilir, o programcının düşüncesine kalmıştır.

Stored procedurelerde return değeri sadece matematiksel tipler olmalıdır. Mesela yukarıdaki örnek için eğer return değerine “kaydınız başarıyla yapıldı” şeklinde string bir ifade döndürseydik bu ifadeyi arayüz programımızda kullanamazdık. Öyle return değerleri atayıp procedure’ümüzü derlediğimizde hata yazısı göremeyiz ama bu şekilde yapmanın bir anlamı yoktur ve yanlıştır.

Biraz da stored procedureleri düzenlemeden bahsetmek istiyorum. Örneğin kayıtyap procedureümüzü değiştirmek istiyoruz çünkü tablomuza bir sütun daha ekledik, o zaman procedure’ü yaratırken kullandığımız “create” ifadesi yerine “alter” yazmamız yeterli olacaktır. Sonra alacağı değerleri tabloya göre düzenler ve procedurede istediğimiz değişikliği yapabiliriz

Bu yazımda sizlere stored procedureler ile ilgili giriş için bir bilgi vermeye çalıştım. Diğer yazılarımda stored procedurelerin c#ta kullanımını bütün yönleriyle incelemee çalışacağım. Görüşmek üzere…

Emrah KOÇAK
kocakemrah@gmail.com



ACCESS’DE Kİ KAYITLARI LİSTELEME VE KAYIT EKLEME(WINDOWS APP.)


 


            Bu
makalemizde C#’ta ADO.NET ile access veri tabanına bağlanıp veri
tabanındaki kayıtları nasıl okuyacağımızı ve veri tabanına nasıl veri
ekleyebileceğimizi anlatmaya çalışacağım.


 


           
Uygulamamıza geçmeden önce ADO.NET hakkında kısaca bilgi vermek
istiyorum.


.Net teknolojisinde
veri tabanı erişim sınıflarının genel adına ADO.NET diyoruz. ADO.NET,
.Net teknolojisi için geliştirilmiş yeni bir veri erişim teknolojisidir.
ADO.Net’in amaçları arasında;


 


           
*İlişkisel veya ilişkisel olmayan verilere kolay erişim.


           
*Kendinden önceki uygulamalardan daha fazla veri kaynağını
destekleyebilecek             


            
kapasite artışı.          


           
*Internet üzerinden çok katmanlı uygulamalara destek


            *XML ile
ilişkisel veri erişimini birleştirmek.


 


            ADO.NET’in
temel isim alanı (namespace) “System.Data” dır. Örneğin SQL ile
çalışırken ayrı ayrı hem “System.Data.SqlClient” hem de
“System.Data.OleDb” isim alanlarını kullanabiliriz.
“System.Data.SqlClient” isim alanı yanlızca SQL sunucu için optimize
edilmiştir. Access veri tabanı ile çalışacaksak “System.Data.OleDb” isim
alanını kullanmamız gerekir.


 


            ADO.NET
hakkında bu kısa bilgiden sonra uygulamamıza geçelim. Öncelikle erişim
sağlayıp üzerinde işlem yapacağımız access veri tabanımızı oluşturalım.
Ben aşağıdaki gibi bir veri tabanı hazırladım.


 


ACCESS
VERİ TABANI


 



 
  
 


 


 



Hazırladığımız veri tabanını hard diskimizde herhangi bir yere kayıt
edelim. Ben bu uygulamada veri tabanını d sürücüsüne kaydediyorum.


 


Veri
tabanını hazırladıktan sonra uygulamamızı nasıl geliştireceğimize karar
vermeliyiz.


 


HAZIRLIK


 



1-)Veri tabanına bağlantı için kullanılacak provider ve data source
nedir?



            Provider=Microsoft.Jet.OleDb.4.0  (Access’e bağlantı için
gerekli provider)



            Data Source=D:/sirket.mdb


 



2-)Veri Tabanı ile işlemler için kullanılacak nesnelerimiz nelerdir?



            Aşağıdaki gibi 4 adet nesne oluşturmamız gerekiyor.



            Connection 

 baglan
(Veri tabanına bağlantı için)



            Command    
→ 
sec ve ekle (Seçme ve ekleme işlemleri için)



            DataReader


oku (Okuma yapmak için)


 



3-)Form Tasarımını ve programın nasıl çalışacağını belirleyelim.



Formumuzun üzerine şekildeki gibi 2 buton, 4 label ve 4 textbox
ekliyoruz. Oku butonuna her bastığımızda veri tabanındaki kayıtları
textbox1 ve textbox2 de listeleyelim. Ekle butonuna bastığımızda ise
textbox3 ve textbox4’e yazdığımız veriler Access veri tabanına eklensin.


Ön
hazırlığımızı yaptıktan sonra artık kodlarımızı yazmaya başlayabiliriz.
İşin en güzel kısmı da burası:)


 


WINDOWS
APPLICATION


 



           

Visual
studio 2005 C#’da Windows application açıyoruz. Formumuzu yukarıdaki
gibi tasarladıktan sonra kodları yazmaya başlıyoruz.


 


using

System.Data.OleDb;


//Access ile işlemler için gerekli isim alanını tanımladım.

 


namespace

ADO.NET_AccessInsertveSelect_

{

   
public
partial
class
Form1 : Form

    {

       
public Form1()

        {

           
InitializeComponent();

        }

 

       
// Bağlantıda ve diğer işemlerde kullanacağım
nesneleri global           


        //olarak tanımladım.


OleDbConnection

baglan = new
OleDbConnection
(); //bağlantı için


OleDbCommand

sec = new
OleDbCommand
();    //Tablodaki
kayıtları seçmek için 


OleDbCommand

ekle = new
OleDbCommand
();   //Tabloya kayıt
eklemek için 


OleDbDataReader

oku;                     //okuma işlemini
yapmak için


 


//Formumuza çift tıklayarak kod satırına geliyoruz.

       

private

void Form1_Load(object
sender, EventArgs e)

        {

           
//Form açılır açılmaz veri tabanına
bağlantının

           
//kurulması için form1_load içinde access e
bağlanıyorum.

baglan.ConnectionString="Provider=Microsoft.Jet.OleDb.4.0;Data
Source=d:/sirket.mdb;"
;

           
//baglantıyı açıyorum.

           
baglan.Open();

           
//aşagıdaki komutu şu şekilde de
kullanabiliriz.

           
//sec.Connection=baglan;

           
//ikiside aynı işi yapar yani sec komutunun


            //baglan ile çalışacağını…

            sec
= baglan.CreateCommand();

           
//firmalar tablosundaki tüm kayıtlar
seçiliyor.

            sec.CommandText
= "SELECT * FROM firma";

           
//seçilen bu kayıtlar ExecuteReader()
fonksiyonu

           
//DataReader nesnesi sayesinde okunuyor

            oku
= sec.ExecuteReader();

           
//Okuma işlemi oku butonuna tıkandığında
olacağı için

           
//read() fonksiyonunu altta button1_Click
içinde kullanacağız.


 

        }


//Formumuzun üzerindeki Button1’e çift tıklayarak kod satırına geliyoruz

 

       
private void
button1_Click(object sender,
EventArgs e)

        {

           
try

            {

             
//Burada try ve catch kullanıyoruz

              //çünkü
veri tabanındaki kayıtların hepsi

             
//okunup okunacak veri kalmadığı zaman
catch’in içindeki hata


              //oluşuyor.

               
oku.Read();

               
//Acsess’ki no sütununu textbox1′de göster

              
 textBox1.Text = "" + oku["firma
no"
];

               
//Acsess’ki firma sütununu textbox2′de göster

               
textBox2.Text = "" + oku["firma
adı"
];

            }

           
catch (InvalidOperationException)

            {

               
//veri tabanındaki tüm kayıtlar okunup

               
//okunacak veri kalmadığı zaman aşağıdaki
mesaj veriliyor.

               
MessageBox.Show("Okunacak
veri kalmadı."
);

            }

 

        }


//Formumuzun üzerindeki Button2’e çift tıklayarak kod satırına geliyoruz

       

private

void button2_Click(object
sender, EventArgs e)

        {

           
try

            {

               
//Buradaki try catch’i ise hatalı veri
girişini önlemek


                //için kullandık

               
//Örneğin Textbox’lara veri girmeden ekle
butonuna basarsak

               
//catch’in içindeki mesaj verilir.

 

               
ekle = baglan.CreateCommand();

     
          //textbox3′e girilen değeri firma
no sütününa


                //textbox4′e girilen  değeri firma adı sütununa ekle

ekle.CommandText
= "INSERT INTO firma([firma no],[firma adı])
VALUES(‘"
+ textBox3.Text+"’,'"
+ textBox4.Text + "’)";           

           
if (ekle.ExecuteNonQuery() == 1)

            {

  
//Buradaki if i ise şunun için kullandık;

  
//eğer ExecuteNonQuery fonksiyonu doğru bir
şekilde çalışmışsa yani 1 se

  
//yani veri doğru bir şekilde eklenmişse
aşağıdaki mesajı ver.

               
MessageBox.Show("Veri
Eklendi."
);

            }

            }

           
catch(OleDbException)

            {

               
//hatalı veri girişinde verilecek mesaj.

               
MessageBox.Show("Hatalı
veri girişi yaptınız."
);

            }

        }}}

Artık
programımızı çalıştırarak veri tabanındaki kayıtları okuyabilir ve kayıt
ekleyebiliriz.

Bir sonraki
makalede görüşmek üzere…

İyi çalışmalar…

Bu yazıda Access
veri tabanındaki kayıtları Console uygulamasında nasıl listeleyeceğimizi
anlatmaya çalışacağım.

            İlk
olarak Access de aşağıdaki gibi bir veri tabanı oluşturalım.

Bu hazırladığımız
veri tabanını hardiskimizde herhangi bir yere kayıt edelim. Ben bu
uygulamada veri tabanını C sürücüsüne kaydediyorum. Doğal olarak Access
e bağlantıda kullanılacak data source de aşağıdaki gibi oluyor.

   


Data
Source=C: /okul.mdb   (.mdb Access in uzantısıdır.)

Veri tabanını
hazırladıktan sonra bu veri tabanına c# ta ADO.NET ile nasıl bağlantı
kurup buradaki verileri nasıl okuyacağımıza geçelim. Bu işlemi Console
uygulaması olarak yapacağız.

 

1-) Console
Application

 

 İşlemleri nasıl
yaptığımızı kodun ve kodun nasıl çalıştığını adım adım anlatmaya
çalışacağım.

 


//ADO.NET in temel isim zayı(namespace) System.Data dir.


//Örneğin SQL ile çalışırken ayrı ayrı hem SqlClient hem de OleDb isim
uzaylarını kullanabiliriz.


//SqlClient isim uzayı yalnızca sql sunucu için optimize edilmiştir.


//Access veri tabanı ile çalışacaksak System.Data.OleDb isim uzayını
kullanmamız gerekir.

 

           

using

System.Data.OleDb;

 


namespace

ConsoleApplication1

{

   
class Program

    {

       
static void
Main(string[] args)

        {

 


// Access ile bağlantı için gerekli provider ı yazıyoruz.


// Veri tabanımızın yerini belirtiyoruz.


 


string

kaynak="Provider=Microsoft.Jet.OleDb.4.0;
Data
Source=c:/okul.mdb;";


//Connection sınıfından baglan nesnemizi türetiyoruz.

           
OleDbConnection baglan =
new
OleDbConnection
(kaynak);

 


//bağlantımızı açıyoruz

           
baglan.Open();

 


//Bağlantı açıldıktan sonra aşağıdaki mesaj yazdırılıyor.

           
Console.WriteLine("Bağlantı
açıldı…"
);

 


//OleDbCommand sınıfından komut nesnesini türetiyoruz.

           
OleDbCommand komut =
new
OleDbCommand
();

 


//komut nesnesinin baglan nesnesi ile çalışacağını belirtiyoruz.

           
komut = baglan.CreateCommand();

 


//Komut nesnemizin ne iş yapacağını yazıyoruz.


//Aşağıdaki sql komutundan da anlaşılacağı gibi komut sınıf tablosundaki
//tüm kayıtları seçiyor.

           
komut.CommandText = "SELECT * FROM sınıf";

 


//OleDbDataReader nesnemizi türetiyoruz.

           
OleDbDataReader oku;

 


//ExecuteReader() fonksiyonu CommandText deki komutu çalıştırır.


//Yani aşağıdaki kodun açıklaması komut.CommandText = "SELECT * FROM
//sınıf"; çalıştırarak seçme işlemini yap. Okuma işlemi ise Read()
//fonksiyonuyla yapılar

           
oku = komut.ExecuteReader();

 


//Dos ekranında çıktının daha düzenli görünmesi için aşağıdakileri
yazdırıyoruz.


//burada \t{0} demek tab tuşuna basılmış gibi boşluk bırak ve birinci
//eleman olarak No yu yaz,


//boşluk bırak İsim i yaz gibi.. Ekranda aşağıdaki gibi görünür.

src="es3_files/image001.jpg" v:shapes="_x0000_s1025">

           
Console.WriteLine("\t{0}\t{1}\t{2}","No","İsim","soyad");

           
Console.WriteLine("\t{0}\t{1}\t{2}","—–","—–","—–");

 

 


//Sıra kayıtları okumak için döngü kurmaya geldi. Döngü kuruyoruz çünkü
veri tabanımızda birden fazla kayıt var.


//Aşağıda while döngüsü veri tabanındaki kayıtlar bitene kadar çalışır
ve //okunacak kayıt kalmayınca döngüden çıkar.


//Okuma işlemini görüldüğü gibi while ın içinde Read() fonksiyonuyla
//yapıyoruz.

           
while (oku.Read())

            {

  
Console.WriteLine("\t{0}\t{1}\t{2}",oku["no"],oku["isim"],oku["Soyad"]); 

            }

 


//Son olarak kayıtlarımızın tümünü okuyunca bağlantımızı kapatıp mesaj
veriyoruz ve görüntünün ekranda beklemesi için Console.Read()
fonksiyonunu kullanıyoruz.

           
baglan.Close();

           
Console.WriteLine("Bağlantı
kapandı…"
);

           
Console.Read();

      }

   }

}

 

 

Kodumuzu yazmayı
bitirdikten sonra çalıştıralım.

Görüldüğü gibi
Access veri tabanındaki kayıtların tümünü listelemiş olduk. Bir sonraki
yazıda aynı uygulamanın Windosw Application da nasıl yapıldığını
anlatacağım.

İyi çalışmalar…

Günümüze kadar geliştirilen profesyonel yada profesyonel
olmayan yazılımların büyük bölümünde verilerin gerek bir dosyada gerekse
veritabanlarında saklanması , bu verilere erişilmesi ve verilerin kullanılması
gerekmiştir . Verilerin  saklanması için birçok dosya türü ve veritabanından
bahsetmek mümkün . Bu yazımda sizlere SQL Server da bulunan bir veritabanına ve
Access bir veritabanına nasıl bağlanabileceğimizi birer örnek uygulama ile
sizlere aktarıyor olacağım .

            .NET teknolojilerinde SqlClient , OleDb ve Data
isim uzayları sayesinde veritabanlarına bağlanabilir , veritabanı işlemlerini
gerçekleştirebiliriz .

            İlk örneğim de SQL Server 2005 üzerinde bulunan
bir veritabanına bağlanıyor olacağız . Bunun için yukarıda da bahsettiğim gibi
öncelikle System.Data.SqlClient isim uzayını
projemize dahil ediyorum .


using

System.Data.SqlClient;


namespace

WindowsApplication1

{

   
public
partial
class
Form1 : Form

    {

       
public Form1()

        {

           
InitializeComponent();

        }

 

       
private void
btnSqlebaglan_Click(object sender,
EventArgs e)

        {

           
//server=bölümüne . yerine localhost yada
veritabanının  bulunduğu sunucunun ismini yazabilri

           
//eğer sunucu ayarlarınızda kullanıcı adı ve
şifre ile bağlanmaya ayarlamış iseniz

           
//bağlantı cümlemiz ==> "server=.;database=urunler;uid=sa;password=1234;"
şeklinde olacaktı

           
//sa = server admib

           
SqlConnection baglanti =
new
SqlConnection
("server.;database=urunler;trusted_onnection=true;");

 

           
// .Open() fonksiyonu sayesinde bağlantımı
açabiliriz

           
baglanti.Open();

 

           
//bağlantı durumunu bir labele yazdırabiliriz
açık yada kapalı mı?

           
lblDurum.Text = baglanti.State.ToString();

 

           
// .Close() fonkksiyonu ile işimiz bitince
bağlantımızı kapatıyoruz

           
baglanti.Close();

 

        }

 

    Gördüğünüz gibi veritabanına bağlanması
bu kadar kolay bir işlem . Şimdi örneğimizi biraz inceleyelim . Bağlantı
cümlenizde server= bölümüne bağlanmak istediğiniz sunucunu adını
yazacaksınız . Eğer kendi bilgisayarınızda sunucuya bağlanıyor iseniz
localhost
yada sadece “ .” yazmanız yeterli olacaktır.  Bağlantımızı
açmak için kullandığımız .Open( ) fonksiyonu  ve bağlantımızı işimiz
bittikten sonra kapattığımız .Close( ) fonksiyonu System.Data.SqlClient
isim uzayı ile birlikte gelmektedir . Veri tabanı işlemlerimizde işimiz
bittikten sonra bağlantımızı koparmamız çok önemlidir .

   

   
İkinci örneğimizde
de Access üzerinde bulunan bir veritabanına bağlanıyor olacağız . Bu uygulamamız
için de öncelikle System.Data.OleDb isim
uzayını projemize ekliyoruz .

 


using

System.Data.OleDb;


namespace

WindowsApplication1

{

   
public
partial
class
Form1 : Form

    {

       
public Form1()

        {

            InitializeComponent();

        }

 

       
private void
btnAccesseBaglan_Click(object sender,
EventArgs e)

        {

           
// Access için bir bağlantı nesnesi
oluşturuyoruz

           
OleDbConnection baglanti =
new
OleDbConnection
();

 

            //
Oluşturduğumuz nesnenin bağlantı cümlesini yazıyoruz

           
baglanti.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Sorce=uygulama.mdb"
;

 

           
// Bağlantımızı .Open() fonksiyonu ile
açıyoruz

           
baglanti.Open();

 

            //
Bağlantımızın açılıp açılmadığını kontrol için labelimize durumu
yazdırıyoruz

           
lblSonuc.Text = baglanti.State.ToString();

 

           
// ve işimiz bittikten sonra bağlantımızı
kapatıyoruz .

           
baglanti.Close();

 

        }

 

    Bu iki uygulamamız ile aslında ADO.NET
ile programlamaya giriş yapmış olduk . Uygulamalarınızda kullanacağınız
veritabanına bağlantılarının ADO.NET ` in bize sağladığı kolaylıkları da bir
nebze olsun görmüş olduk . Yazı dizime  veritabanı işlemleri ile devam etmek
istiyorum . Umarım bu yazım da okuyucularıma yardımcı olmuşumdur .

© 2010 bilyaz.com , Programlama Makaleleri, Yazılım Makaleleri , Örnek Kodlar , Eğitim Videoları , C#,ASP.NET,SQL,PHP Suffusion WordPress theme by Sayontan Sinha