Merhaba Webkolog takipçileri,
Bugün sizlere C# .NET Framework 4 kullanarak Microsoft SQL Server ile nasıl etkileşim kuracağımızı detaylı bir şekilde anlatacağım. Veritabanı işlemleri, yazılım geliştirmenin temel taşlarından biri ve bu makalede hem Connected (Bağlantılı) hem de Disconnected (Bağlantısız) mimarileriyle SQL Server işlemlerini adım adım inceleyeceğiz. Haydi başlayalım!
---Giriş: Veritabanı Bağlantıları ve Temel Kavramlar
SQL Server ile iletişim kurarken bilmemiz gereken ilk ve en önemli şey bağlantı (Connection) kurmaktır. .NET Framework bize bu konuda çeşitli sınıflar sunar. Genellikle SqlConnection
sınıfını kullanırız.
Bağlantı Cümlesi (Connection String): Veritabanına nasıl bağlanılacağını tanımlayan bir metin dizisidir. Sunucu adresi, veritabanı adı, kimlik doğrulama bilgileri gibi detayları içerir. Her bilgi noktalı virgülle (;
) ayrılır ve bu bilgilere segment denir.
- DataSource: Veritabanı sunucusunun adı veya IP adresi. (Zorunlu)
- Initial Catalog: Bağlanılacak veritabanının adı. (Zorunlu)
- Integrated Security: Windows kimlik doğrulaması kullanılıp kullanılmayacağı.
True
ise Windows hesabı, değilse SQL Server kimlik doğrulaması kullanılır. (Zorunlu)
Connection String Örnekleri:
// Windows Authentication
Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True
// Standard Security
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
// Trusted Connection
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;
// Bir SQL Server Instance'ına Bağlanma
Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername;Password=myPassword;
// IP Adresi Üzerinden Bağlanma
Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;
Visual Studio 2010 ile Connection String Öğrenme: Visual Studio 2010'da Data > Add Data Source kısmından kolayca connection string alabilirsiniz.
SQL Server Ayarları: Eğer SQL Server'a Windows Kimlik Doğrulaması yerine SQL Server ve Windows Kimlik Doğrulaması ile bağlanmak isterseniz, SQL Server Management Studio'da (local) > Sağ tık: Properties > Security > SQL Server and Windows Authentication seçeneğini işaretlemelisiniz. Kullanıcı şifrelerini değiştirmek için ise (local) > Security > Logins > [kullanıcı seç] adımlarını takip edebilirsiniz.
---Connected Mimari ile Veritabanı İşlemleri
Bu mimaride, veritabanına bağlanırız, işlemi yaparız ve bağlantıyı hemen kapatırız. Veriye anlık erişim sağlarız.
Kütüphane Ekleme:
using System.Data.SqlClient;
Veritabanı Bağlantısı Açma ve Kapatma:
SqlConnection conn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
// Bağlantıyı aç
conn.Open();
// Bağlantı durumu kontrolü
// conn.State
// İşlemlerinizi burada yapın
// Bağlantıyı kapat
conn.Close();
/*
// Express Edition ile DB dosyasına bağlanma örneği
SqlConnection connFile = new SqlConnection(@"Data Source = .\SQLEXPRESS; AttachDBFilename = |DataDirectory|\Database1.mdf; Integrated Security = True; User Instance = True;");
connFile.Open();
connFile.Close();
*/
Kayıt Listeleme (SELECT):
SqlConnection conn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT TOP 2 * FROM Kategoriler", conn);
SqlDataReader sdr = cmd.ExecuteReader(); // Veriyi okumak için SqlDataReader kullanılır
while (sdr.Read())
{
// Verileri okuma yöntemleri
MessageBox.Show(sdr.GetString(1)); // İndeks ile okuma (NULL değerler için hata verebilir)
// MessageBox.Show(sdr["KategoriAdi"].ToString()); // Sütun adı ile okuma
}
sdr.Close(); // DataReader'ı kapatmayı unutmayın!
conn.Close();
Kayıt Ekleme (INSERT):
SqlConnection conn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO Tablo (isim, yas) VALUES (@isim, @yas)", conn);
// SQL Injection riskini azaltmak için parametre kullanımı önemlidir.
cmd.Parameters.AddWithValue("@isim", txtAd.Text);
cmd.Parameters.AddWithValue("@yas", txtSoyad.Text);
int etkilenenSatirSayisi = cmd.ExecuteNonQuery(); // Etkilenen satır sayısını döndürür
MessageBox.Show(etkilenenSatirSayisi + " kayıt eklendi.");
conn.Close();
Kayıt Güncelleme (UPDATE):
SqlConnection conn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("UPDATE Tablo SET isim = @isim WHERE id = @id", conn);
cmd.Parameters.AddWithValue("@id", intId);
cmd.Parameters.AddWithValue("@isim", strIsim);
int etkilenenSatirSayisi = cmd.ExecuteNonQuery();
MessageBox.Show(etkilenenSatirSayisi + " kayıt güncellendi.");
conn.Close();
Kayıt Silme (DELETE):
SqlConnection conn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("DELETE FROM Tablo WHERE id = @id", conn);
cmd.Parameters.AddWithValue("@id", intId);
int etkilenenSatirSayisi = cmd.ExecuteNonQuery();
MessageBox.Show(etkilenenSatirSayisi + " kayıt silindi.");
conn.Close();
Stored Procedure (Saklı Yordam) Kullanımı:
SqlConnection cnn = new SqlConnection("Data Source=ALI-BILGISAYAR;Initial Catalog=KuzeyRuzgari;Integrated Security=True");
cnn.Open();
SqlCommand cmd = new SqlCommand("sp_UrunKaydet", cnn);
cmd.CommandType = System.Data.CommandType.StoredProcedure; // Komut tipini StoredProcedure olarak belirtiyoruz
// Parametre ekleme (AddWithValue ile daha kolay)
cmd.Parameters.AddWithValue("@KatID", (cmbKategori.SelectedItem as Kategori).KategoriID);
cmd.Parameters.AddWithValue("@Fiy", txtFiyat.Text);
// Farklı bir parametre ekleme yöntemi (daha detaylı kontrol sağlar)
SqlParameter prm = new SqlParameter("@Stok", SqlDbType.Int);
prm.Value = txtStok.Text;
cmd.Parameters.Add(prm);
SqlParameter prm2 = new SqlParameter("@UAdi", SqlDbType.NVarChar, 50);
prm2.Value = txtUrunAdi.Text;
cmd.Parameters.Add(prm2);
int etkilenen = cmd.ExecuteNonQuery();
MessageBox.Show(etkilenen + " ürün kaydedildi.");
cnn.Close();
Transaction (İşlem) Kullanımı: Birden fazla veritabanı işlemini tek bir mantıksal birim olarak yürütmek için kullanılır. Tüm işlemler başarılı olursa Commit, herhangi bir hata oluşursa Rollback ile işlemler geri alınır.
SqlConnection cnn = new SqlConnection("Server=.; Database=KuzeyRuzgari; trusted_connection=true;");
cnn.Open();
SqlTransaction trans = cnn.BeginTransaction(); // Transaction başlatılır
SqlCommand cmd01 = new SqlCommand("UPDATE Urunler SET Fiyat = 13 WHERE UrunID = 1", cnn);
SqlCommand cmd02 = new SqlCommand("UPDATE Urunler SET Fiyat = 13 WHERE UrunID = 2", cnn);
// Her komuta transaction nesnesi atanır
cmd01.Transaction = trans;
cmd02.Transaction = trans;
try
{
cmd01.ExecuteNonQuery();
// throw new Exception("Bir Hata Cıkartık"); // Hata durumunu test etmek için bu satırı açabilirsiniz
cmd02.ExecuteNonQuery();
trans.Commit(); // Tüm işlemler başarılı ise commit edilir
MessageBox.Show("İşlemler başarıyla tamamlandı.");
}
catch (Exception ex)
{
trans.Rollback(); // Hata oluşursa işlemler geri alınır
MessageBox.Show("Hata Çıktı.. İşlemler Geri Alındı: " + ex.Message);
}
finally
{
cnn.Close();
}
---
Disconnected Mimari ile Veritabanı İşlemleri (ADO.NET DataSet)
Bu mimaride, veritabanından bir veri kümesi (DataSet) alınır, bağlantı kapatılır, veri üzerinde işlemler yapılır ve daha sonra tekrar bağlantı açılıp değişiklikler veritabanına gönderilir. Özellikle büyük veri kümeleri veya çevrimdışı çalışma gerektiren durumlarda etkilidir.
DataSet, DataTable, DataRow, DataColumn, DataView:
- DataSet: Bir veya daha fazla
DataTable
nesnesi içerebilen, bellekteki veritabanı benzeri bir yapıdır. - DataTable: Tek bir veritabanı tablosunu temsil eder.
- DataRow:
DataTable
içindeki tek bir satırı temsil eder. - DataColumn:
DataTable
içindeki tek bir sütunu temsil eder. - DataView: Bir
DataTable
üzerinde filtrelenmiş veya sıralanmış bir görünüm sağlar.
Veriyi DataSet'e Aktarma:
SqlConnection cnn = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Tablo", cnn); // SqlDataAdapter kullanılır
DataSet ds = new DataSet();
sda.Fill(ds); // Verileri DataSet'e doldurur
// Not: Fill metodu, bağlantıyı kendisi açar ve kapatır.
// cnn.Open(); ve cnn.Close(); satırlarına bu kısımda ihtiyacımız kalmaz.
// DataSet'teki verilere erişim
foreach (DataRow item in ds.Tables[0].Rows) // İlk tabloya erişim
{
MessageBox.Show(item[1].ToString()); // İndeks ile sütuna erişim
// MessageBox.Show(item["isim"].ToString()); // Sütun adı ile erişim
}
DataSet Üzerinde Değişiklikler ve Güncelleme:
// Yeni kayıt ekleme
DataRow dr = ds.Tables[0].NewRow();
dr["isim"] = "Ali";
ds.Tables[0].Rows.Add(dr);
// Kayıt güncelleme
ds.Tables[0].Rows[0]["isim"] = "Veli";
// Kayıt silme
ds.Tables[0].Rows[1].Delete(); // Satırı silinmiş olarak işaretler, henüz veritabanından silmez
// Değişiklikleri veritabanına gönderme
SqlConnection cnnUpdate = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
SqlDataAdapter sdaUpdate = new SqlDataAdapter("SELECT * FROM Tablo", cnnUpdate);
// Insert, Update ve Delete komutlarını manuel olarak tanımlamamız gerekebilir
// Alternatif olarak, CommandBuilder kullanabiliriz (basit senaryolar için)
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(sdaUpdate);
sdaUpdate.Update(ds); // Değişiklikleri veritabanına gönderir
MessageBox.Show("Değişiklikler veritabanına gönderildi.");
DataGridView ile Veri Gösterimi:
SqlConnection cnn = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM Urunler", cnn);
DataTable dt = new DataTable();
adp.Fill(dt);
dataGridView1.DataSource = dt; // DataTable'ı DataGridView'e bağlama
DataAdapter için Manuel Komut Tanımlama: Karmaşık senaryolarda veya stored procedure kullanırken InsertCommand
, UpdateCommand
ve DeleteCommand
'i manuel olarak tanımlamanız gerekebilir.
SqlConnection connection = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
SqlDataAdapter adapter = new SqlDataAdapter();
// SelectCommand
SqlCommand selectCommand = new SqlCommand("SELECT * FROM Customers WHERE Country = @Country AND City = @City", connection);
selectCommand.Parameters.Add("@Country", SqlDbType.NVarChar, 15);
selectCommand.Parameters.Add("@City", SqlDbType.NVarChar, 15);
adapter.SelectCommand = selectCommand;
// InsertCommand
SqlCommand insertCommand = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) VALUES (@CustomerID, @CompanyName)", connection);
insertCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
insertCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
adapter.InsertCommand = insertCommand;
// UpdateCommand
SqlCommand updateCommand = new SqlCommand("UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName WHERE CustomerID = @oldCustomerID", connection);
updateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
updateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
SqlParameter parameter = updateCommand.Parameters.Add("@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original; // Orijinal değeri korur
adapter.UpdateCommand = updateCommand;
// DeleteCommand
SqlCommand deleteCommand = new SqlCommand("DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
parameter = deleteCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
adapter.DeleteCommand = deleteCommand;
// Ya da daha kısa haliyle (biraz daha manuel kontrol)
/*
sda.SelectCommand = conn.CreateCommand();
sda.SelectCommand.CommandText = "SELECT * FROM Tablo";
sda.InsertCommand = conn.CreateCommand();
sda.InsertCommand.CommandText = "INSERT INTO Tablo (isim) VALUES (@isim)";
sda.InsertCommand.Parameters.Add("@isim", SqlDbType.NVarChar, 50, "isim"); // DataColumn adını belirtiyoruz
sda.UpdateCommand = conn.CreateCommand();
sda.UpdateCommand.CommandText = "UPDATE Tablo SET isim = @isim WHERE id = @id";
sda.UpdateCommand.Parameters.Add("@isim", SqlDbType.NVarChar, 50, "isim");
SqlParameter updateParam = sda.UpdateCommand.Parameters.Add("@id", SqlDbType.Int, 0, "id");
updateParam.SourceVersion = DataRowVersion.Original;
sda.DeleteCommand = conn.CreateCommand();
sda.DeleteCommand.CommandText = "DELETE FROM Tablo WHERE id = @id";
SqlParameter deleteParam = sda.DeleteCommand.Parameters.Add("@id", SqlDbType.Int, 0, "id");
deleteParam.SourceVersion = DataRowVersion.Original;
*/
---
SQL Server Compact Edition (Local Database)
SQL Server Compact Edition (CE), daha küçük boyutlu uygulamalar veya mobil cihazlar için tasarlanmış gömülü bir veritabanı çözümüdür. Kendi başına çalışır ve SQL Server Express'e göre daha az kaynak tüketir. Genellikle 256 eşzamanlı bağlantıyı destekler.
Kullanım Alanları: Mobil uygulamalar, masaüstü uygulamalarında basit lokal veri depolama.
Kütüphane Ekleme:
Projenize sağ tıklayıp Add Reference > .NET > System.Data.SqlServerCe seçeneğini eklemeniz gerekir.
using System.Data.SqlServerCe;
Bağlantı ve Veri Okuma:
SqlCeConnection conn = new SqlCeConnection("Data Source = Database1.sdf"); // .sdf uzantılı dosya
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandText = "Tablo";
cmd.CommandType = System.Data.CommandType.TableDirect; // TableDirect, tüm tabloyu okumak için kullanılabilir
SqlCeDataReader sdr = cmd.ExecuteReader();
while (sdr.Read()) {
MessageBox.Show(sdr[1].ToString());
}
sdr.Close();
conn.Close();
---
Umarım bu detaylı makale, C# .NET Framework 4 ile MS SQL işlemlerini anlamanıza ve kendi projelerinizde uygulamanıza yardımcı olmuştur. Veritabanı yönetiminde Connected ve Disconnected mimarilerin farklarını ve hangi senaryoda hangisinin daha uygun olduğunu artık daha iyi biliyorsunuz!
Webkolog'u takipte kalın!
Hepinize bol kodlu ve başarılı projeler dilerim!
0 yorum:
Yorum Gönder