Arkadaşlar Merhaba bu yazımda C# 4.0 ile SqlConnection Baglantısı Nasıl Yapılır Onu Anlatmaya Calısacagım ,Kodlar Asagıdaki Gibidir
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient; //Uzayımızı NameSpace Alanımıza Ekliyoruz
namespace SqlBaglantı
{
public partial class Form1 : Form
{
SqlConnection con; // con nesnemize kod alanında her yerden ulasmak icin “public partial class Form1″ altında tanımlıyoruz
public Form1()
{
InitializeComponent();
}
private void btnBaglan_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection();
con.ConnectionString = “Data Source=CAN-BILGISAYAR;database=test;Integrated Security=SSPI”;
con.Open();
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
con.Close(); // Baglantımızı Kapatıyoruz.
}
}
}
}
Şimdi btnBaglan_Click içersinide bulunan kodları tek tek açıklıyalım;
SqlConnection con = new SqlConnection(); //SqlConnection Sınıfından “con” isminde Baglantı Nesnesi türetiyoruz.
con.ConnectionString // Veritabanına Baglanabilmek için Gerekli Olan Baglantı Cümlesinin Yazıldıgı Alan
Data Source=CAN-BILGISAYAR // Sql Serverda Serverinizin Adı
database=test // Sql Serverda Üzerinde İşlem Yaptıgımız Veritabanımızın Adı
Integrated Security=SSPI // Güvenlikle ilgili olan kısım
con.Open() // ise Olusturmus oldugumuz baglantı Cümlemizin Acılmasını yani baglantıyı gerçekleştiren komut Parçasıdır
Bugünkü Yazımızın Sonuna Geldik,Umarım Faydalı olmustur.
Can Gündüz
SQL Server Reporting Services kullanırken tablix ‘ inize uygulamak istediğiniz filtrede parametre olarak aldığınız bir değer ile datasetinizde bulunan bir alan ile karşılaştırmak istiyorsanız ve bu alan içerdiği değere göre değişiyorsa basit bir şekilde düzenleyebiliyoruz.
senaryo : parametre olarak bir bitiş tarih değeri alıyorsunuz. Karşılaştırmak istediğiniz datasetteki alanda işin bitiş tarih alanı ama , eğer iş bitiş tarihi boş ise iş gözden geçirme tarihine göre filtrelemek istiyorsunuz. Tablix ‘inizin filters bölünende Expression yazan bölümün yanındaki fx i tıkladığınızda açılan pencerede koşula göre alan getirebiliyorsunuz.

açılan pencereye
=iif(Fields!bitis_Tarihi.Value Is Nothing , Fields!GozdenGecirme_Tarihi.Value , Fields!bitis_Tarihi.Value)
ifadesini ekliyoruz. bu sayede bitiş tarihi alanı boş gelmesi durumunda Gözden geçirme tarihi alanına göre karşılaştırma yapacaktır. Operator bölümünde karşılaştırma ifademizi seçiyoruz. Value bölümünde istersek parametre değer istersek sabit değer de vererek karşılaştırma yapabiliriz.
<map> tagı bir resim ya da harita üzerinde tıklanabilir alanlar oluşmasını sağlayan bir tagdir.<map> tagında olması gereken attribute “name”dir.<map> tagı <img> tagının “usemap” attributesi ile birlikte kullanılır.
<map> tagı ile <area> tagı yardımıyla tıklanabilir alanlar oluştururuz. Tıklanabilir alanlar tıklandığı zaman başka bir image’a yönleniyor.Harita ve image arasında bağlantı sağlanmış oluyor.
w3school.com adlı siteden bir örnekle daha ayrıntılı bir şekilde anlatmaya çalışacağım.
Elimizde 3 tane gezegen resminin olduğu bir resim var.Bu resimde 3 tane tıklnabiir alan var:sun,mercury,venus.
Kullanıcı hangisine tıklarsa o gezegenle ilgili resme yönleniyor.
Tıklanabilir alan oluşturulan resim(harita):
güneş
mercur
venus
<map name=”planetmap”>
//burda yazılan name img tagınının “usemap” attributesinde kullanılacaktır
<area shape=”rect” coords=”0,0,82,126″ alt=”Sun” href=”sun.htm” />
<area shape=”circle” coords=”90,58,3″ alt=”Mercury” href=”mercur.htm” />
<area shape=”circle” coords=”124,58,8″ alt=”Venus” href=”venus.htm” />
</map>
<img src=”planets.gif” width=”145″ height=”126″ alt=”Planets” usemap=”#planetmap” />
Böylece hangi nesneye gidilirse onun resmi açılacaktır.
DERYA GÜNDÜZ
Javascript c ve benzeri dillerdeki fonksiyon işlevini görmektedir.Javacripte yazdığınız işlevleri html kısmında fonksiyon adı ile çağırırsınız,böylece fonksiyondan yapmasını istediğiniz şey uygulanmış olur.Javascript kodları <head> tagi arasına yazılır.Basit bir hesap makinası örneği ile Javascriptin genel mantığı ile ilgili bir fikriniz olabilir:
<html>
<head>
<title>Untitled</title>
<script type=”text/javascript”>
function addition()
{
s1=document.getElementById(“textbox1″).value;
//textboxa verilen id değeri yardımıyla oraya yazılan değer alınıyor
s2=document.getElementById(“textbox2″).value;
textboxresult.value=parseInt(s1)+parseInt(s2);
//değerler var tipindedir,onlara işlem yaptırtmak için int çevirmek gerekiyor
}
function subtraction()
{
s1=document.getElementById(“textbox1″).value;
s2=document.getElementById(“textbox2″).value;
textboxresult.value=parseInt(s1)-parseInt(s2);
}
function multip()
{
s1=document.getElementById(“textbox1″).value;
s2=document.getElementById(“textbox2″).value;
textboxresult.value=parseInt(s1)*parseInt(s2);
}
function division()
{
s1=document.getElementById(“textbox1″).value;
s2=document.getElementById(“textbox2″).value;
if(s2==0)
alert(“donomioater cant be ,change the value”)
else
textboxresult.value=parseInt(s1)/parseInt(s2);
}</script>
</head>
<body>
<input type=”text” id=”textbox1″ >
</br>
<input type=”text” id=”textbox2″ >
</br>
<input type=”button” id=”buttonadd” value=”+” onclick=”addition()”>
<input type=”button” id=”buttonasub” value=”-” onclick=” subtraction()”>
<input type=”button” id=”buttonamul” value=”*” onclick=”multip()”>
<input type=”button” id=”buttondiv” value=”/” onclick=”division()”>
</br>
<input type=”text” id=”textboxresult” >
</body>
</html>
Bağımsız bir kuruluş olan W3C (World Wide Web Consortium) organizasyonu tarafından tasarlanan ve bağımsız bir yapıya sahip olan XML (extensible Markup Language),kişilerin kendi etiketlerini tanımlayarak bu etiketler ile hiyerarşik yapı kurabildikleri ,bunları istedikleri zaman değiştirebildikleri ; esnek, teknolojiden -platformdan bağımsız text tabanlı bir meta dilidir. Xml açılımının içerdiği “markup” onun tagler ile kullanıldığını,”exensible” de onun genişletilebildiği yani standart taglerin değil de kendimizin oluşturduğu farklı tagleri de kullanabileceğini ifade eder. Html de bir markup dilidir fakat Xmli Htmlden ayıran en önemli özellik standart taglerin değil de kişilerin tanımladıkları taglerin kullanabiliyor olmasıdır.
Şimdi teknolojiden-platformdan bağımsız derken ne kastettiğimi biraz daha açmak istiyorum:
Günümüz teknolojisi o kadar zenginleşti ve çeşitlendi ki…..Farklı farklı işletim sistemleri,programlar… Bunlar bir yana bir programın bile birden çok farklı versiyonu var. Bu kadar çeşitliliğin olması şüphesiz yanında uyum problemlerini getirecektir.Bir dosyayı aynı programın farklı versiyonlarında çalıştırmak istediğimizde bile zaman zaman problem yaşamaktayız,kaldı ki farklı program ve işletim sistemlerinde yaşanmasın.Bütün teknolojilerde ortak olarak açılan ve çalışan tek dosya türü text dosyalarıdır(notepad).Ama notepad ile en basitinden bir tablo oluşturup bunun üzerinde çalışmak istediğimizde bile bu tabloyu organize etmek baya bir zor olacaktır:kolonların sırası kayabilir,karışabilir….Bunun yerine tablolarımızı hiyerarşik yapı ile xmle atmak işimizi bayağı bir kolaylaştıracaktır.Xml verinin hızlı bir şekilde sogulanmasını,değiştirilmesini,transfer edilmesini,verinin içerik bilgisi ile saklanmasını(bu noktada htmlden ayrılır) sağlar.Xmlin güzel yanlarından birtanesi de uluslararası bir standarttır ve evrensel bir formattır ve firewallara takılmaz(text tabanlı olmasından kaynaklı).
Bir dosyanın xml dosyası olduğu dosyanın başında yazan <?xml version=”1.0″ encoding=”utf-16”?> ifadesinden anlaşılır.Htmldeki gibi açılan tag kapanmalıdır.Genel anlamda xml dosya akışı şu şekilde olur.
dosya akışı şu şekilde olur.
<?xml version=“1.0“ encoding=“utf-8“ ?>
<kategoriler>
<kategori>
<kategoriID>1</kategoriID>
<kategoriAdi>meyveler</kategoriAdi>
</kategori>
<kategori>
<kategoriID>2</kategoriID>
<kategoriAdi>sebzeler</kategoriAdi>
</kategori>
</kategoriler>
Veri tabanından veri çekerek xmle yazdırılabilir ve gerektikçe xmlden okunabilir.Bu şekil bir kullanım daha mantıklı olacaktır,çünkü veri tabanından bilgi almak istediğimizde program her defasında veri tabanına bağlanmak zorunda kalacaktır,oysa ki bir defa bağlanıp veri tabanındakileri xmle yazdırıp gerektikçe xmlden okumak performans,veri tabanını çok meşgul etme ve daha birçok açıdan daha olumlu sonuçlar yaratacaktır.Bu okuma ve yazdırmaları yapmak üzere tanımlanmış “ReadXml ve WriteXml” nesneleri vardır.
WriteXml şu şekilde kullanılır:
SqlConnection conn = new SqlConnection(“server=derya-pv\\sqlexpress;database=Northwind;integrated security=true”);
SqlDataAdapter adp = new SqlDataAdapter(“select CategoryID,CategoryName from Categories”, conn);
DataSet dt = new DataSet();
adp.Fill(dt);
dt.WriteXml(dosya);
Böylece veri tabanındaki bilgiler xmle yazılmış oldu.Her veri çekmek istediğimizde “ReadXml” ile verileri xmlden alıp işleyebiliriz.Yada satır satır okuma ve yazma yapmak için XmlTextReader ve XmlTextWriter da kullanılabilir.
Oluşturulan Xml üzerinde update,delete işlemleri için de “XmlDocument” ve “XmlNode” nesneleri oluşturulup kullanılır.
Kimi zaman belirli bir kısmı üzerinde değişiklik yapmak isteriz,bu durumda hepsini belleğe almak yerine sadece değiştirmek istediğimiz kısmı almalıyız.Bunun içinde şu nesneler kullanılmalı:
XPathDocument()-xml şemayı okuyacak nesne
XPathNavigator()-doküman üzerinde gezinecek nesne
XPathNodeNaveigator()-nodelar üzerinde tek tek gezinecek nesne
DERYA GÜNDÜZ

Elimizde iki tablolu bir yapı olduğunu düşünelim, İşçiler ve Yöneticiler. Üç adet yöneticimiz ve bu yöneticilere bağlı 60000 çalışanımız olsun. Yöneticilere ait olan işçi sayılarına baktığımızda :
Select COUNT(*),yoneticiID From tblIsci Group By yoneticiID Order By yoneticiID |
|
Yonetici ID |
İşçi Sayısı |
|
1 |
40000 |
|
2 |
19999 |
|
3 |
1 |
İlk olarak 1 adet işçinin bağlı olduğu ID si 3 olan yöneti ve işçi bilgilerini sorgulayalım.
|
Sıra |
SQL Sorgusu |
Sonuç |
|
|
1 |
|
Etkilenen Satır Sayısı : 1 Sorgu Maaliyeti : 0.0006 |
|
|
2 |
|
Etkilenen Satır Sayısı : 1 Sorgu Maaliyeti : 0.0006 |
Yukarıdaki 1 ve 2 numaralı testleri incelediğimizde etkilenen satır sayısı ve sorgu maaliyetleri aynı oldu. Şimdi birde etkilenen satır sayısı arttığında sorgu maaliyetinde bir değişme olacak mı ? bunu gözlemleyelim.
|
Sıra |
SQL Sorgusu |
Sonuç |
|
|
3 |
|
Etkilenen Satır Sayısı : 40000 Sorgu Maaliyeti : 4.326 |
|
|
4 |
|
Etkilenen Satır Sayısı : 40000 Sorgu Maaliyeti : 0.305 |
3 ve 4 numaralı testlerimize baktığımızda etkilenen satır sayıları eşit ve 40000, ama bu sefer sorgu maaliyetleri Join işleminde düşük çıktı.
Sonuç olarak kullanacağımız sorgularda eğer farklı tablolardan veriler ile çalışıyor ve etiklenecek olan satır sayısının büyük olacağını kestirebiliyorsak Join işlemlerini Sub Query işlemlerine tercih etmeliyiz.
ADO.NET teknolojisi ile veritabanından veri çekmenin 2 yolu vardır.
- Connected Mimari
- Disconnected Mimari
Connected Mimari:
Bu mimaride veri tabanından veri çekme süresi boyunca uygulama veritabanına bağlı kalır ve bilgiler bağlı kalma süresi boyunca çekilebilir.Veri çekmek için veritabanına sürekli bağlı olması zorunluluğundan dolayı sql server sürekli meşgul olur,bu bir dezavantajdır.Connected ile veri çekebilmek için SqlCommand ile ConnectionString yazılır ve veriler SqlDataReader ile okunur.SqlDataReader ile veriler tek tek okunur,bu da bir dezavantaj sayılabilir.Connected mimarinin güzel yönlerinden bir tanesi sqlden alınan verilerin daima en güncel veriler olmasıdır,yapılan bütün değişikler direk veritabanına yansıdığı için veri alınacağı zaman da en güncel veriler gelir.Connected yapıda disconnected yapıya göre veriler daha hızlı çekilir(datareaderden dolayı)
Disconnected Mimari:
Bu mimaride uygulama sqle bağlı olmaz,bağlı olmadan veriler çekilir.Peki nasıl oluyor da bağlı olmadığı halde veritabanından veri çekebiliyor?Uygulamanın veritabanına bağlı olmadan veri çekmesini sağlayan yapı SqlDataAdapterdır.Disconnected mimaride SqlDataAdapter nesnesi oluşturulur ve bu aracı nesne sayesinde veri tabanından veri çekilir,bütün bağlantılar bunun üzerinden yapılır.Uygulama veritabanına hiç bağlanmadığı için de buna disconnected yapı denilmiş.Disconnected mimaride bağlantı açılıp kapanmaz,SqlDataAdapter bağlantıyı kendisi açar kapatır.DataAdaptör üzerindeki sql verileri datatable ve datasetlere doldurulur(fill).Böylece sqldeki veriler kullanıma hazırdır.
DataTable—->bellek üzerindeki tablodur
DataSet——>bellek üzerindeki datatablelardır(oluşturulan datatablelar datasete atılır)
Disconnected yapıda uygulama veritabanına bağlı olmadığı için veritabanını meşgul etmek anlamında connected yapıdan daha iyidir.Ama disconnected yapı connected yapıya göre daha eski bilgiyi getirir,veritabanı üzerindeki değişiklikler direk veritabanına yansımadığı için en güncel veriye ulaşamıyor.Databasede yapılan değişikler biz istediğimiz zaman veritababnına yansır.
DERYA GÜNDÜZ
deryagunduz.blogspot.com
Trigger nedir?
Trigger’ın kelime anlamı tetikleyicidir,
Sqldeki anlamı da database tabloları üzerinde bir değişiklik olduğu zaman çalışan sql sorgularıdır.
Triggerlar ile insert,update,delete yapılabilir.
Trigger oluşturmak
create trigger TriggerAdi on TabloAdi tetikleyici seçeneği(hangi olay olduğunda çalışsın) as select .... creat trigger tg_KategoriSilindi on Categories for delete --category silinmesini takip ediyor as select 'biri bir tane kategori sildi' as silme ---verilecek mesaj |
Yeni eklenecek olan çalışanın adını veoyadını ve aldığı ID değerini ekrana
yazdıralım:
create trigger tg_CalisanEklendi on Employees for insert as declare @ad varchar(10) declare @soyad varchar(10) declare @id int select @ad=FirstName, @soyad=LastName, @id=EmployeeID from inserted declare @veri varchar(36) set @veri=cast(@id as varchar(3))+' '+@ad+' '+@soyad select @veri as veriyo insert into Employees(FirstName,LastName) values('fulya','ayluf') |
–ekleme işlemini yapılacağı zaman trigger da çalışır ve ekleme işlemi
İnstead of Triggerlar
Triggerlar ile asıl yapılması gereken yerine başka bir iş yaptırmak istediğimizde instead of trigger kullanılır.
Bu örnekte silme işlemi yerine mesaj verdirtecez:
create trigger tg_KtegorileriKoruyalim
on Categories
instead of delete
as
select ‘Kategorileri silemezsin!!!’ as mesaj
delete from Categories where CategoryID=1
İnsead of triggerların önemli kullanım alanlarından bir tanesi de viewler ile birlikte kullanmaktır,birden fazla kaynak tablo ile oluşturulmuş viewlerde insert,update,delete işlemleri yapılmak istendiğinde instead of trigger kullanmak zorunda kalınıyor,aksi halde hata verir.
DERYA GÜNDÜZ
deryagunduz.blogspot.com
View ler hangi durumlarda kullanılır,faydaları nelerdir?
Yapacağınız sql işleminde birden fazla tabloyu ve onların farklı farklı colonlarını kullanacaksınız,hepsini birleştirmek ,gerekli tablodan sorgu yapmak biraz zahmetli bir iş olabilir,bunun yerine view denen sanal tablolardan oluşturup,gerekli colonları farklı tablolardan alıp sorguları tek bir tablo üzerinden yapmak işinizi kolaylaştırailir.Karmaşık sorgular kolay bir hale gelmiş olur.Ayrıca view kullanmanın çok önemli nedenlerinden bir tanesi sağladığı güvelikler.Tablolarınızın tamanının görünmesini istemediğiniz zamanlarda sanal tablo kullanıp tablolarınızın tamamının görünmesini engelleyebilirsiniz.
View ler üzerinde yapılan değişikler kendilerini oluşturan kaynak tabloları da etkiler,aynı değişiklikler kaynak tablolara da yansır.
Oluşturulan Viewler resimde görüldüğü gibi Object Explorer kısmında ana başlık altında toplanır:
Viewler nasıl oluşturulur?
create view vw_viewAdi
–tavsiye olunur ki oluşturulan view adları vw_ ile başlasın,böylece veri tabanınıza yeni bakan biri onun view olduğunu kolayca alsın
as
select kolonAdi from tabloAdi
where şart
with check option
view oluştururken with check point ifadesi yazılırsa,tanımlamadaki where şartı muhafaza edilmiş olur where şartı dışındaki insert,update,delete işlemleri yapılmaz hata verir
create view vw_DogruHazirlanmisView
as
select firstname,lastname
from Employees
where FirstName like ‘a%’
with check option
insert into vw_DogruHazirlanmisView values(‘derya’,'dd’)
–eklenme yapılmak istendiğinde hata verir
hata:The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint.(with check pointten dolayı ‘a’ ile başlamayan bir ekleme yapılamaz)
with Schemabinding
Viewin oluşturulduğu kaynak tablo üzerinde değişiklik yapılmasına izin vermeyecek.
create view vw_CokUgrastim
with schemabinding –sütunla ilgili bir değişiklik yapılamıyor
as
select firstname,lastname,city
from dbo.employees –dbo. olmalı
drop table Employees –yazıldığında hata verir
hata:Could not drop object ‘Employees’ because it is referenced by a FOREIGN KEY constraint.
with encription(gizli view)
Kaynekların gizliliğini sağlayan koddur,kullanıcı sadece oluşturulan view ile ilgili verilere erişebiliyor,kaynak tablolarla ilgili hiç bir bilgiye ulaşamıyor.
create view vw_Benim
with encryption –kaynak görmeme,design aktif değil
as
select * from products
Resimde de görüldüğü gibi gizli view kullanıldıktan sonra viewin üstünde kilit işareti olur ve ‘modify’ seçeneği aktiif değildir.












Son Yorumlar