Makale Özeti

ADO.Nete hızlı bir bakış için...

Makale

0. Giriş
1. ADO.NET Nesne Grubu
2. İş Katmanından Veritabanına Bağlanmak
3. Genel Fonksiyonlar
4. Stored Procudurelara Erişmek.
5. Stored Procudurelardan Dönen Değerlere Ulaşmak
6. İş Katmanında Transaction

Giriş

      MS Press tarafından yayınlanan Adım Adım ASP.NET kitabını incelerken ADO.NET kısmına geldiğimde okuduğum ilk cümle şu oldu : "ADO.NET başlı başına bir kitap konusu olmaya yetecek kadar geniş bir konudur." Fakat burda bir veritabanı programcısının temel ihtiyaçlarını rahatlıkla karşılayabilecek kavram ve yöntemleri inceleyeceğiz.

      ADO, n tabanlı bir uygulamada veri katmanı ile iş katmanı arasında veri transferini sağlayan teknolojidir. .NET devrimi ile ADO da yeni özellikler kazandı.

1. ADO.NET Nesne Grubu

      ADO.NET ile gelen özelliklerin en önemlisi artık veritabanı tipine özel bağlantı nesnelerinin oluşturulmasıdır. Örneğin MSSQL Server 2000 veritabanına bağlanmak için SqlConnection nesnesini kullanırız. Bu performans açısından ciddi hız kazandırmıştır. Aynı şekilde veritabanı ile işlemler yaparkende veritabanı tipine özel oluşturulmuş nesneler yardımıyla artık daha hızlı ve daha kolay hale gelmiştir.

      ADO daki temel nesnelerden viri Connection idi. Hangi veritabanı olursa olsun bu nesne ile bağlantı sağlanıyordu. ADO.NET te buna karşılık SqlConnection, OracleConnection, OleDbConnection ve OdbcConnection seçeneklerimiz mevcut

      ADO nun ikinci temel nesnesi Command ise ADO.NET te yine veritabanı tipine göre değişkenlik arz ederek alternatifleri ile geliyor. SqlCommand, OracleCommand, OldeDdCommand ve OdbcCommand.

      ADO yu oluşturan temel nesnelerin üçüncüsü RecordSet in alternatifleri yine birden fazla nesneden oluşuyor : DataSet, DataReader ve DataAdapter.

DataSet : RecordSet in gelişmiş versiyonudur. Birden fazla tablo sorgusunu barındırabilir, aralarında ilişki kurulabilir.

DataAdapter : DataSet ile veritabanı arasında köprü vazifesi görür. Insert, Update, Delete işlemlerini DataSet içindeki değişikliklere göre uygular.

DataReader : Veritabanından okunan kayıtsetini hızlı bir şekilde sunum katmanına aktarır. Sadece ileri doğru okunur ve okunan her kayıt hafızadan silindiği için hafızada yer tutmaz ve performasnı arttırır. Salt okunurdur.

2. İş Katmanından Veritabanına Bağlanmak

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. Open() fonksiyonu ile bağlantı açılır
4. Veritabanı ile yapacağımız işemler yapılır.
5. Close() fonksiyonu ile veritabanı bağlantımız kapatılır.

Örnek :

1     SqlConnection SqlConn = new SqlConnection();
2     SqlConn.ConnectionString = "server=127.0.0.1;"
		+ "database=NorthWind;uid=sa;password=123";
3     SqlConn.Open();
4     // işlemler
5     SqlConn.Close();

3. Genel Fonksiyonlar

      Veritabanı programcılarının temel işlevleri, kayıt girme, güncelleme ve silme işlemleridir. Bunun için veritabanı programcılarının ADO.NET te en çok kullanacakları nesne xxxCommand dir. ( xxx , veritabanı tipine göre değişkenlik gösterir. Örneğin; SqlCommand )

      Şimdi bu nesnenin fonksiyonlarını inceleyeceğiz.

a. ExecuteNonQuery : Insert, Update, Delete gibi veritabanında değişiklik yapacak sorguların çalıştırılabileceği fonksiyondur. Geriye Sql sorgusundan etkilenen satır miktarını integer tipinde döndürür.

Örnek :

SqlConnection SqlConn = new SqlConnection();
SqlConn.ConnectionString = "server=127.0.0.1;"
	+ "database=NorthWind;uid=sa;password=123";

SqlCommand Comm = new SqlCommand();
Comm.Connection = SqlConn;
Comm.CommandType = CommandType.Text;

string CompanyName = txtCompanyName.Text;
string Phone = txtPhone.Text;
string sql = "Insert into Shippers(CompanyName,Phone)"
	+ " values(Mutasyon Corp.,0212 123 45 67)";

Comm.CommandText = sql;
			
SqlConn.Open();
Comm.ExecuteNonQuery();
SqlConn.Close();

b. ExecuteScalar : Tek bir değer döndüren sorgularda kullanılır. Örneğin "Select Count(*) Tablo1" gibi. Birden fazla satır ve sütun döndürecek bir sorgu kullanıldığında sonuç tablosunun ilk satır ve ilk sütündaki değeri döndürür.

Örnek :

SqlConnection SqlConn = new SqlConnection();
SqlConn.ConnectionString = "server=127.0.0.1;"
	+ "database=NorthWind;uid=sa;password=123";

SqlCommand Comm = new SqlCommand();
Comm.Connection = SqlConn;
Comm.CommandType = CommandType.Text;

Comm.CommandText = "Select Count(*) From Shippers";
			
SqlConn.Open();
object oReturn = Comm.ExecuteScalar();
SqlConn.Close();
	
Response.Write( oReturn.ToString() );

c. ExecuteReader : xxxDataReader nesnesi ile birlikte kullanılır. Veri görüntülerken kullanılır. Sadece ileri ve salt okunurdur.

Örnek :

SqlConnection SqlConn = new SqlConnection();
SqlConn.ConnectionString = "server=127.0.0.1;"
	+ "database=NorthWind;uid=sa;password=123";

SqlCommand Comm = new SqlCommand();
Comm.Connection = SqlConn;
Comm.CommandType = CommandType.Text;

Comm.CommandText = "Select CompanyName,Phone From Shippers";
			
SqlConn.Open();

SqlDataReader myReader;
myReader = Comm.ExecuteReader();

Response.Write("<table>");

while(myReader.Read())
{
	Response.Write("<tr>");
	Response.Write("<td>" + myReader["CompanyName"] + "</td>");
	Response.Write("<td>" + myReader["Phone"] + "</td>");
	Response.Write("</tr>");
}

Response.Write("</table>");

SqlConn.Close();

4. Stored Procudurelara Erişmek.

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. SqlCommand Nesnesi oluşturulur
4. Command nesnemizin Connection 1. adımda oluşturduğumuz Connection nesnesi atanır.
5. Command nesnemizin CommandType özelliğine Stored Procedure ile çalışacağımızı bildiriz
6. Command nesnesinin daha önce sql ifademizi yazdığımız Text özelliğine kullanacağımız Stored Procedure ün ismini yazarız.
7. Kullanacağımız Stored Procedureün ihtiyaç duyduğu parametre ve değerlerini gireriz
8. Connection nesnemizi açarız
9. Command Nesnemizi çalıştırırız.
10. Connection nesnemizi kaparız.

Örnek :

1	SqlConnection SqlConn = new SqlConnection();
2	SqlConn.ConnectionString = "server=127.0.0.1;"
		+ "database=NorthWind;uid=sa;password=123";
3	SqlCommand Comm = new SqlCommand();
4	Comm.Connection = SqlConn;
5	Comm.CommandType = CommandType.StoredProcedure;
6	Comm.CommandText = "NewShippers";
7	Comm.Parameters.Add("@CompanyName",CompanyName);
	Comm.Parameters.Add("@Phone",Phone);
8	SqlConn.Open();
9	Comm.ExecuteNonQuery();
10	SqlConn.Close();

5. Stored Procudurelardan Dönen Değerlere Ulaşmak

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. SqlCommand Nesnesi oluşturulur
4. Command nesnemizin Connection 1. adımda oluşturduğumuz Connection nesnesi atanır.
5. Command nesnemizin CommandType özelliğine Stored Procedure ile çalışacağımızı bildiriz
6. Command nesnesinin daha önce sql ifademizi yazdığımız Text özelliğine kullanacağımız Stored Procedure ün ismini yazarız.
7. Kullanacağımız Stored Procedureün ihtiyaç duyduğu parametre ve değerlerini gireriz
8. Stored Procedure dan geri dönecek değeri karşılayabilecek bir SqlParameter nesnesi oluştururz.
9. Oluşturduğumuz SqlParameter nesnesinin Output tipinde olduğunu bildirirz.
10. Oluşturduğumuz SqlParameter nesnesini Command nesnesine dahil ederiz.
11. Connection nesnemizi açarız
12. Command Nesnemizi çalıştırırız.
13. Stored Proceudre dan dönen değeri karşılamak için object türünde bir değişken tanımlarız
14. 12. adımda çalıştırdığımız Stored Procedure gerekli işlemleri yaptı ve output parametresine işlem sonucu oluşan değeri atadı. Şimdi Command nesnesinin Parameters özelliğini kullanarak bu parametrenin değerini 13. adımda tanımladığımız object tipindeki değişkene atıyoruz.
15. Connection nesnemizi kaparız.
16. object tipinde değişkeni yazdırırız.

Örnek :

 1	SqlConnection SqlConn = new SqlConnection();
 2	SqlConn.ConnectionString = "server=127.0.0.1;"
		+ "database=NorthWind;uid=sa;password=123";
 3	SqlCommand Comm = new SqlCommand();
 4	Comm.Connection = SqlConn;
 5	Comm.CommandType = CommandType.StoredProcedure;
 6	Comm.CommandText = "GetShipperCompanyName";
 7	Comm.Parameters.Add("@ShipperID",ShipperID);
 8	SqlParameter myParam = new SqlParameter("@CompanyName",
 		SqlDbType.NVarChar,40);
 9	myParam.Direction = ParameterDirection.Output;
10	Comm.Parameters.Add(myParam);
11	SqlConn.Open();
12	Comm.ExecuteNonQuery();
13	object oReturn;
14	oReturn = Comm.Parameters["@CompanyName"].Value;
15	SqlConn.Close();
16	Response.Write(oReturn.ToString() );

6. İş Katmanında Transaction

1. Önce bir SqlConnection nesnesi oluşturulur.
2. Oluşturduğumuz nesnenin ConnectionString özelliğine bağlantı cümlesi atanır
3. SqlCommand Nesnesi oluşturulur
4. Command nesnemizin Connection 1. adımda oluşturduğumuz Connection nesnesi atanır.
5. Command nesnemizin CommandType özelliğine Stored Procedure ile çalışacağımızı bildiriz
6. Command nesnesinin daha önce sql ifademizi yazdığımız Text özelliğine kullanacağımız Stored Procedure ün ismini yazarız.
7. Kullanacağımız Stored Procedureün ihtiyaç duyduğu parametre ve değerlerini gireriz
8. Connection nesnemizi açarız
9. SqlTransaction tipinde bir nesne oluştururuz. Bunuda Connection nesnemizin BeginTransaction() foknsiyonu yardımıyla yaparız.
10. Command nesnemizin Transaction özelliğine 9. adımda oluşturduğumuz SqlTransaction nesnesini atarız.
11. bir try-catch bloğu başlatırız. İşlemlerimiz sırasında hata ile karşılaşırsak catch bloğunda yaptığımız işemleri geri alacağız.
12. Command nesnemizin ExecuteNonQuery fonksiyonunu kullanarak veritabanı işlemlerini başlatıyoruz. Veritabanı ile ilgişi işlemler sırasında bir hata ile karşılaşılmadı ise program normal akışı itirabiyle alt satıra geçecek. Bir problemle karşılaşılması halinde ise catch bloğuna atlayacak.
13. Bu adıma geçildiyse eğer veritabanı işlemleri başarıyla tamamlanmış demektir. Ancak henüz veritabanımızda herhangi bir değişiklik yapılmadı. SqlTransactipn nesnemizin Commit() fonksiyonu ile bu değişikliklere onay veriyoruz ve işlemimiz geçerli kılınıyor. Programımız bu adımdan sonra catch bloğunu atlayarak devam edecektir.
14. try bloğunda bir problem çıkması halinde otomatikmen catch bloğunda ki komutlar uygulanmaya başlar.
15. Veritabanı ile yapmak istediğimiz işlemler sırasında bir problem çıktığı için yapılan değişiklikleri SqlTransaction nesnesinin Rollback() fonksiyonu ile geri alıyoruz.
16. Connection nesnemizi kaparız.

Örnek :

	
1	SqlConnection SqlConn = new SqlConnection();
2	SqlConn.ConnectionString = "server=127.0.0.1;"
		+ "database=NorthWind;uid=sa;password=123";
3	SqlCommand Comm = new SqlCommand();
4	Comm.Connection = SqlConn;
5	Comm.CommandType = CommandType.StoredProcedure;
6	Comm.CommandText = "UpdateCity";
7	Comm.Parameters.Add("@Name",Name);
	Comm.Parameters.Add("@uCityID",CuityID);
8	SqlConn.Open();
9	SqlTransaction myTransaction = SqlConn.BeginTransaction();
10	Comm.Transaction = myTransaction;
11	try {
12		Comm.ExecuteNonQuery();
13		myTransaction.Commit();
		}
14	catch {
15		myTransaction.Rollback();
		}
16	SqlConn.Close();