update etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
update etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Bir önceki makalemizde bir veritabanı modelini Entity Framework ile Database-First tekniğini kullanarak uygulamamıza dahil etmiştik. Bugün ise Insert, Update ve Delete işlemlerinin nasıl yapıldığını inceleyeceğiz. Data okuma işlemleri ile ilgili detaylı incelemeyi LINQ metotları başlığında ele almıştık.

EntityCrud adında bir veri tabanı oluşturarak içerisine Personel ve Departman adında iki tablo ekleyerek aralarındaki ilişkiyi belirtelim.

CREATE DATABASE EntityCRUD

 

USE EntityCRUD

 

CREATE TABLE Personel

(

      Id INT PRIMARY KEY IDENTITY(1,1),

      Ad NVARCHAR(30) NOT NULL,

      Soyad NVARCHAR(30) NOT NULL,

      Maas DECIMAL(10,3) NOT NULL,

      DepartmanId INT NOT NULL

)

 

CREATE TABLE Departman

(

      Id INT PRIMARY KEY IDENTITY(1,1),

      DepartmanAd NVARCHAR(50) NOT NULL

)

 

ALTER TABLE Personel

ADD CONSTRAINT FK_Personel_Departman FOREIGN KEY(DepartmanId)

REFERENCES Departman(Id)

Bir Console uygulaması açalım. Daha sonra da oluşturduğumuz veri tabanını modelini uygulamamıza ekleyelim. Nasıl ekleyeceğimiz ile ilgili detaylı bilgileri  bir önceki makalemizde bulabilirsiniz. Modelimizi ekledikten sonra Insert, select, update ve delete işlemlerini ayrı ayrı ele almaya çalışalım.

INSERT

Oluşturduğumuz Personel ve Departman tablolarında şuan hiçbir kayıt bulunmamaktadır. Uygulamamızdaki context nesnemiz üzerinden bu işlemi gerçekleştiriyor olacağız.  Veritabanı modelini uygulamamıza dahil ettiğimizde Personel ve Departman adında 2 adet sınıf oluşturulmuştur. Bunlara entity sınıflar denir ve veri tabanı içerisindeki tablolaları temsil etmektedirler. Yapmamız gereken işlem son derece basit, bu sınıfların nesne örneklerini yaratarak context nesnesi yardımı ile kolayca insert yapabilme şansına sahibiz.

static void Main(string[] args)

        {

            EntityCRUDEntities context = new EntityCRUDEntities();

 

            Departman dep = new Departman { DepartmanAd = "IT" };

            context.AddToDepartman(dep);

            context.SaveChanges();

        }

Management Studio ile Departman tablosundaki dataları görüntülediğimizde IT adına sahip departmanın eklendiğini göreceğiz.

image

Şimdi de bu departmana sahip bir Persoenel ekleyelim.

EntityCRUDEntities context = new EntityCRUDEntities();

 

Personel pers = new Personel

{

      Ad = "Onur",

      Soyad = "Salkaya",

      Maas = 1000,

      DepartmanId = context.Departman.First(dep => dep.DepartmanAd == "IT").Id

};

 

context.AddToPersonel(pers);

context.SaveChanges();

image

Bir personel nesnesi üzerinden departman ekleyebilmemiz de mümkündür.

static void Main(string[] args)

        {

            EntityCRUDEntities context = new EntityCRUDEntities();

 

            Departman dep = new Departman { DepartmanAd = "Muhasebe" };

 

            Personel pers = new Personel

            {

                Ad = "Ali",

                Soyad = "Veli",

                Maas = 1500,

                Departman = dep

            };

 

            context.AddToPersonel(pers);

            context.SaveChanges();

        }

Eklediğimiz Personel nesnesi üzerinde bir Departman nesnesi de mevcuttur. Dikkat ederseniz herhangi bir Departman eklemedik. Bu personel üzerinden yaptığımız işlemde Entity Framework departmanı da insert etmektedir.

image

UPDATE

Update işlemi yapmak , ilgili veri tabanı kaydını ram’e çıkarıp, bağlı olduğu property’e değer atayarak SaveChange() metodunu çalıştırmak demektir. Onur adlı personelin maaşını 2000 yapalım.

static void Main(string[] args)

        {

            EntityCRUDEntities context = new EntityCRUDEntities();

 

            //Personel pers = context.Personel.FirstOrDefault(p => p.Ad == "Onur");

            Personel pers = context.Personel.FirstOrDefault(p => p.Id == 1);

            pers.Maas = 2000;

            context.SaveChanges();

        }

image

Bu personel üzerinden, bağlı olduğu departman kaydını da update edebilmemiz mümkündür. Onur adlı personel şu anda 1 numaralı departmana bağlı. Bu departmanın adı şu anda “IT”. pers nesnesi üzerinden update işlemi yaparak 1 numaralı departman adının “Pazarlama” olmasını sağlayalım.

static void Main(string[] args)

        {

            EntityCRUDEntities context = new EntityCRUDEntities();

 

            Personel pers = context.Personel.FirstOrDefault(p => p.Id == 1);

            pers.Departman.DepartmanAd = "Pazarlama";

            context.SaveChanges();

        }

image

DELETE

Update işleminde olduğu gibi silmek istediğimiz kaydı ram’e çıkarırız. Daha sonra DeleteObject metoduna parametre olarak vererek SaveChange metodunu çağırırız.

static void Main(string[] args)

        {

            EntityCRUDEntities context = new EntityCRUDEntities();

 

            Personel pers = context.Personel.FirstOrDefault(p => p.Id == 2);

            context.DeleteObject(pers);

            context.SaveChanges();

        }

Artık Personel tablomuzda adı Ali Veli olan ve 2 numaralı kaydı göremeyeceğiz.

image



13 Nisan 2011 Çarşamba

SQL View ile Update İşlemi

Bir önceki yazıda view’lerin yapısından bahsetmiştik. Şimdi de view üzerinden update işleminin nasıl yapıldığını inceleyeceğiz.

View’lar data tutmazlar. Dolayısı ile view’ler üzerinden yapacağımız bu işlemler, view içerisinde sorgulanan tabloyu direkt olarak etkiler. View' üzerinden update yapabilmemiz için, bu işlemin tek bir tabloyu etkilemesi gerekir. Birden fazla tabloyu etkileyecek bir durum olursa  hata alırız.

İlk olarak AdventureWorks veritabanında, Fiyatı 0 olan ürünleri gösteren bir view yazalım.

CREATE VIEW VW_BedavaUrunler

AS

      SELECT * FROM Production.Product

      WHERE ListPrice=0

 

--Sonuçları görmek için

SELECT * FROM VW_BedavaUrunler

Sonuçlar aşağıdaki gibi olacaktır.

Untitled

Sayfanın sağ altında gördüğümüz gibi, view’a select attığımızda 200 satırlık bir sonuç elde ettik. Şimdi ProductID’si 1,2,3 ve 4 olan ürünlerin fiyatlarını update ederek 100 yapalım.

UPDATE VW_BedavaUrunler SET ListPrice=100 WHERE ProductID IN (1,2,3,4)

 

Bu komutu çalıştırdığımızda aşağıdaki mesajı göreceğiz.

Untitled2

İstediğimiz gibi ID’si 1,2,3 ve 4 olan ürünlerin fiyatlarını 100 olarak update ettik. Bu update işlemi aslında direk Production.Product tablosu üzerinde gerçekleşti.

Şimdi önemli bir noktaya değinelim. Yazdığımız view, Fiyatları 0 olan ürünleri getirmemizi sağlıyordu ve update işleminden önce sorgu sonucundan 200 satır elde etmiştik. Şimdi 4 ürünün fiyatını update ederek 100 yaptık. Yani artık bu ürünlerin fiyatları 0 olmadığından dolayı, bu view’a tekrar select attığımızda 196 satır elde edeceğiz.

Untitled3

Şimdi de view ‘daki data çıkışını engellemek için bir çözüm üretelim. Yani, yapacağımız update işlemi, view’ın satır sayısını değiştiremesin. Yukarıdaki örnek için konuşacak olursak, ‘VW_BedavaUrunler’ üzerinden bir ürünün fiyatını değiştirememeliyiz. Çünkü yazdığımız view zaten fiyatı 0 olan ürünleri getirmekte. Dolayısı ile fiyat kolonunda değişiklik yapmamız, bu view’ın sorgu sonucunda elde ettiğimiz bir datanın kaybolmasına neden olacaktır. Bunu engellemek adına view’ı aşağıdaki gibi değiştirelim.

ALTER VIEW VW_BedavaUrunler

AS

      SELECT * FROM Production.Product

      WHERE ListPrice=0

      WITH CHECK OPTION

Ardından, fiyatlarını 100 olarak update ettiğimiz ürünleri, Production.Product tablosu üzerinden, fiyatları yeniden 0 olacak şekilde updade edelim,

UPDATE Production.Product SET ListPrice=0 WHERE ProductID IN (1,2,3,4)

Bu son haliyle view üzerinden select attığımız zaman 200 satır elde etmiş durumdayız. Şimdi view üzerinden ilk kısımda yaptığımız update işlemini tekrar deneyelim.

UPDATE VW_BedavaUrunler SET ListPrice=100 WHERE ProductID IN (1,2,3,4)

İşte bu hali ile, yukarıdaki update çalışmayacaktır. Çünkü bu ürünlerin fiyatlarını 100 olarak değiştirmemiz demek, view’dan data çıkışı olması anlamına gelir. ‘WITH CHECK OPTION’ diyerek bunu engelledik. Aldığımız hata mesajı aşağıdaki gibi olacaktır.

Msg 550, Level 16, State 1, Line 1

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.

The statement has been terminated.



Basit anlamda veri tabanı ve tablo oluşturmayı, oluşturduğumuz tablo üzerinde de insert, update ve delete işlemlerinin nasıl yapıldığını inceleyelim.

İlk olarak ‘Deneme’ adında bir veritabanı oluşturalım.

CREATE DATABASE Deneme --Bu şekilde logicalName,Oluşan .mdf uzantılı dosyanın yolu, boyut, max boyut vb özellikler default olarak oluşur.

Oluşturduğumuz veri tabanı üzerinde işlem yapmak için de aşağıdaki komutu çalıştıralım.

USE Deneme

Şimdi de oluşturduğumuz bu veri tabanı üzerinde ‘Ogrenci’ adında bir tablo oluşturalım.

CREATE TABLE Ogrenci

(

      OgrenciID INT PRIMARY KEY IDENTITY(1,1),--Bu kolonun primary key olduğunu belirttik. Yani aynı bu kolondaki değerler özgün olmak zorundadır. OgrenciID'si aynı olan 2 satır olamaz. IDENTITY ile de bu kolona veri girilmesini engelledik ve ID'nin otomatik olarak 1'er 1'er artacağını belirtmiş olduk.

      Ad VARCHAR(50) NOT NULL, --Bu kolon boş geçilemez

      Bolum VARCHAR(50) NOT NULL, --Bu kolon boş geçilemez     

Ortalama INT     

)

Tablomuza veri girişi yapalım.

INSERT INTO Ogrenci(Ad,Bolum,Ortalama) VALUES('Cin Ali','Matematik',75)

INSERT INTO Ogrenci(Ad,Bolum,Ortalama) VALUES('Ayşe Deneme','Fizik',50)

INSERT INTO Ogrenci(Ad,Bolum) VALUES('Fatma Deneme','Bilgisayar Mühendisliği')

3. insert ifadesinde, Ortalama kolonu null geçilebilir bir kolon olduğundan buraya veri girişi yapmadık, ‘Fatma Deneme’nin ortalaması veritabanında null olarak kaydedilmiştir.

Normalde parantez içerisinde değer girmek istediğimiz kolonların adını yazıp VALUES komutundan sonra da girilecek dataları yazarız. Eğer Tablodaki tüm kolonlara veri girişi yapacaksak parantez içerisinde kolon isimlerini belirtmeye gerek yoktur.

INSERT INTO Ogrenci VALUES('Test','Kimya',90)

Bu hali  ‘SELECT * FROM Ogrenci’ diyerek tablomuzdaki kayıtları görüntülemek istersek,

Untitled

Insert yaparken ‘Fatma Deneme’ için ortalama bilgisini girmemiştik ve null olarak kaydedildiğini görmüştük. Şimdi bu alanı update edelim.

UPDATE Ogrenci SET Ortalama=35 WHERE OgrenciID=3

2 kolonu birden update etmek istersek,

UPDATE Ogrenci SET Ortalama=35,Bolum='Çevre Mühendisliði' WHERE OgrenciID=3

Son eklediğimiz kaydı silmek istersek,

DELETE Ogrenci WHERE OgrenciID=4 -- 'Test' adındaki kaydı sildik.

Id’si 2 ve 3 olan öğrencileri silmek istersek,

DELETE Ogrenci WHERE OgrenciID IN (2,3)