C# Ile SCOPE_IDENTITY (Son Eklenen Kayıdın ID Sini Almak)

Yeni bir kayıt girdiniz ve bu kaydın rowID sine ihtiyacınız var ise SCOPE_IDENTITY i kullanabilirsiniz.
Aşağıdaki örnek kullanımını açıklamak için yeterli olacaktır.
SQL Query

cmdInsert.CommandText =
"INSERT INTO CrmEmail (CustomerID, EmailAddress, EmailSource) VALUES (@CustomerID, @EmailAddress, @EmailSource) SET @ID = SCOPE_IDENTITY()";
 
cmdInsert.Parameters.ADD("CustomerID", SqlDbType.NVarChar, 10).Value = CariHesapKodu;
cmdInsert.Parameters.ADD("EmailAddress", SqlDbType.NVarChar, 50).Value = EmailAdresi;
cmdInsert.Parameters.ADD("EmailSource", SqlDbType.NVarChar, 30).Value = LinkKaynagi;
cmdInsert.Parameters.ADD("@ID", SqlDbType.Int).Direction = ParameterDirection.Output;
 
conInsert.Open();
cmdInsert.ExecuteNonQuery();
conInsert.Close();
 
MessageBox.SHOW(cmdInsert.Parameters["@ID"].Value.ToString());
Reklamlar

SQL Server’da Transaction Kullanımı/Yönetimi

Veritabanı sistemlerini yüzeysel kullanan geliştiriciler için çok basit gelen işlemler aslında mimari olarak geri planda bir çok iş sürecinin doğru yürütülmesiyle meydana gelmektedir. Bu iş süreçleri veritabanı motoru tarafından yönetilir. Ancak, depoladığımız veriyle ilgili işlemlerin bütünlüğü tamamen bize, yani geliştiriciye aittir.

Örneğin, birbiriyle ilişkili bir sorgu yapısı var ve biz bu kodların tamamının doğru çalışması halinde başarılı bir işlem gerçekleştirmiş olacak isek, bu durumda herhangi bir parça işlemin başarısız olması halinde diğer yapılan tüm işlemlerin geri alınması mantıklı olacaktır. Bu işleme en gerçekçi ve bilinen örnek bankacılık işlemleri gösterilebilir. Bir havale yapmak için gerekli tüm işlemleri yaptınız ve X hesabından Y hesabına 10 tl para göndereceksiniz. Bu işlemin programsal olarak yapılabilmesi için sizin hesabınızdaki bakiyenin UPDATE ile güncellenerek azaltılması, gönderilen hesabın bakiyesinin de UPDATE ile güncellenerek alınan miktar kadar artırılması gerekir. Ancak teknolojide herşey doğru gitmeyebilir. Bu işlemler sırasında herhangi bir hata olursa sizin hesabınızdan 10 tl düşülecek, ancak karşı tarafın hesabı güncellenerek bakiye artırımı gerçekleşmeyebilir.

Veritabanı mimarisinde bu tür iş süreci(transaction) gerektiğinde uyulması gereken prensibe ACID (Atomicity,Consistency, Isolation, Durability) denir.

Şimdi ACID’i sırasıyla inceleyelim.

Bölünemezlik(Atomicity)

Transaction işleminin ana özelliği olarak açıkladığımız bölünemezlik prensibini yansıtır. Bir transaction bloğu yarım kalamaz. Yarım kalan transaction bloğu veri tutarsızlığına neden olur. Ya tüm işlemler gerçekleştirilir, ya da transaction başlangıcına geri döner. Yani transaction’ın gerçekleştirdiği tüm değişiklikler geri alınarak gerçekleşmeden önceki haline döner.

Tutarlılık(Consistency)

Bölünemezlik kuralının alt yapısını oluşturduğu bir kuraldır. Transaction veri tutarlılığı sağlamalıdır. Yani bir transaction içerisinde güncelleme işlemi gerçekleştiyse ve ya kalan tüm işlemler de gerçekleşmeli ya da güncelle işlemi de geri alınmalıdır. Bu veri tutarlılığı açısından çok önemlidir.

İzolasyon(Isolation)

Her transaction veritabanı için bir istek paketidir. Bir istek paketi (transaction) tarafından gerçekleştirilen değişiklikler tamamlanmadan bir başka transaction tarafından görülememelidir. Her transaction ayrı olarak işlenmelidir. Transaction’ın tüm işlemleri gerçekleştikten sonra bir başka transaction tarafından görülebilmelidir.

Dayanıklılık (Durability)

Transaction’lar veri üzerinde karmaşık işlemler gerçekleştirebilir. Bu işlemlerin bütününü güvence altına almak için transaction hatalara karşı dayanıklı olmalıdır. SQL Server’da meydana gelebilecek sistem sorunu, elektrik kesilmesi, işletim sisteminden ya da farklı yazılımlardan kaynaklanabilecek hatalara karşı hazırlıklı ve dayanıklı olmalıdır.

Bilgisayar bilimlerinde imkansız diye bir şey yoktur. Bir sistemin hata vermesi yüzlerce sebebe bağlı olabilir. Örneğin; geçtiğimiz yıllarda büyük bir GSM operatörünün veri merkezinin bulunduğu binaya sel basması sonucu veri kaybı yaşamışlardı. Bu durum olasılığı düşük gibi görünebilir. Ancak bahsi edilen konu önemli veriler olunca, hesaplanması gereken olasılıkların sınırı yoktur. Tüm hata olasılıklarına karşı dayanıklı bir sistem geliştirilmelidir.

Transactıon İfadeleri

Transaction yönetimi için kullanılan dört farklı ifade vardır. Bu ifadeler ile transaction başlatılabilir (BEGIN), işlemler geri alınabilir (ROLLBACK), transaction bitirilebilir (COMMIT) ya da kayıt noktaları (SAVE) oluşturulabilir.

Transactıon’ı Başlatmak: BEGIN TRAN

Transaction’ın başlangıcını belirtir. Bu kısımdan sonraki tüm işlemler transaction’ın bir parçasıdır. İşlem sırasında oluşabilecek olası sorunlarda geri alma ya da transaction’ın sonlandırılması gerçekleştirilebilir.

Söz Dizimi:

1
BEGIN TRAN[SACTION] [transaction_ismi | @transaction_degiskeni]

Transactıon’ı Tamamlamak: COMMIT TRAN

Transaction’ın tamamlandığını ve gerçekleştirilen transaction işlemlerinin kalıcı olarak veritabanına yansıtılması için kullanılır. Transaction tarafından etkilenen tüm değişiklikler, işlemlerin tamamı gerçekleşmese bile, bu işlemden sonra kalıcı hale gelir.
COMMIT işleminden sonra gerçekleşen değişikliklerin geri alınması için, bu işlemleri geri alacak yeni bir transaction oluşturulmalıdır. Örneğin; bir transaction ile, nümerik bir sütun üzerinde 10 birim azaltma işlemi yapıldı ise, bu işlemi geri almak için aynı sütun üzerinde 10 birim artırma işlemi yapacak yeni bir transaction oluşturulmalıdır.

Söz Dizimi:

1
COMMIT TRAN[SACTION] [transaction_ismi | @transaction_degiskeni]

Transactıon’ı Geri Almak : ROLLBACK TRAN

Transaction’ın gerçekleştirdiği tüm işlemleri geri almak için kullanılır. Yani, yapılan tüm işlemler transaction’ın başlangıcındaki haline geri döner. Verilerdeki değişikliklerin anında kalıcı olarak veritabanına yansıtılmadığını belirtmiştik. ROLLBACK ile gerçekleştirilen tüm işlemler geriye alınarak transaction sonucunun tutarlılığı garanti edilir.
ROLLBACK işlemi, oluşturduğunuz transaction mimarisine bağlı olarak, kayıt noktalarına (save points) geri dönüş için de kullanılabilir.

Söz Dizimi:

1
2
ROLLBACK TRAN[SACTION] [transaction_ismi | kayit_noktasi_ismi
| @transaction_degiskeni | @kayit_noktasi_degiskeni]

Sabitleme Noktaları: SAVE TRAN

ROLLBACK işlemi transaction’da en başa dönmek için kullanılır. Bazen de belirli bir noktaya kadar gerçekleşen işlemlerin geçerli kalması istenebilir. Bu işlemlerden sonra gerçekleşecek işlemler için ROLLBACK’e ihtiyaç duyulabilir. Sabitleme noktaları oluşturulması, transaction içerisinde en başa dönmek yerine, belirlenen bir işlem noktasına dönmek için kullanılır

Söz Dizimi:

1
SAVE TRAN[SACTION] [ kayit_noktasi_ismi | @kayit_noktasi_degiskeni ]

Transactıon Oluşturmak

Transaction işlemleri için en uygun örnekler bankacılık ve gsm operatörlerinin veritabanı işlemleridir. Karmaşık ve bir çok iş parçacığı ile gerçekleşen sayısız işlemden oluşan bu tür uygulamalarda iş bloklarının doğru planlanması ve kullanılması önemlidir.
Bir banka veritabanında kullanıcı hesaplarını tutan ve farklı iki banka hesabı arasında havale işlemini gerçekleştirmek için bir uygulama oluşturalım.

Banka müşterilerinin hesap bilgilerini tutan basit bir tablo oluşturalım.

1
2
3
4
5
6
7
CREATE TABLE Accounts(
    AccountID   CHAR(10) PRIMARY KEY NOT NULL,
    FirstName   VARCHAR(50),
    LastName    VARCHAR(50),
    Branch  INT,
    Balance MONEY
);

AccountID : Hesap sahibine özel benzersiz değer.
FirstName : Hesap sahibinin adı.
LastName : Hesap sahibinin soyadı.
Branch : Şube kodu.
Balance : Hesap bakiyesi.

1
2
3
4
INSERT INTO Accounts
VALUES('0000065127','Cihan','Özhan', 489, 10000),
      ('0000064219','Ali','Veli', 489, 500),
      ('0000068233','Hasan','Hseyin', 252, 5844);

Sorgulama için gerekli veriyi eklediğimize göre, artık ilgili prosedürümüzü oluşturarak transaction’ımızı yönetmeye başlayabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE PROC sp_MoneyTransfer(
    @PurchaserID    CHAR(10),
    @SenderID       CHAR(10),
    @Amount         MONEY,
    @retVal         INT OUT
)
AS
BEGIN
    DECLARE @inControl MONEY;
    SELECT @inControl = Balance FROM Accounts WHERE AccountID = @SenderID;
    IF @inControl >= @Amount
    BEGIN
        BEGIN TRANSACTION
            UPDATE Accounts
            SET Balance = Balance - @Amount
            WHERE AccountID = @SenderID
        IF @@ERROR <> 0
        ROLLBACK
            UPDATE Accounts
            SET Balance = Balance + @Amount
            WHERE AccountID = @PurchaserID
        IF @@ERROR <> 0
        ROLLBACK
        COMMIT
    END
    ELSE
    BEGIN
        SET @retVal = -1;
        RETURN @retVal;
    END
END;

Prosedürün aldığı parametreleri açıklamak gerekirse;

PurchaserID : Alıcı hesabın ID’si
SenderID : Gönderen hesabın ID’si
Amount : Gönderilecek tutar
retVal : Prosedür içerisinden geriye değer dönmeyi sağlayan OUT parametre. İşlem başarısız olursa -1 değeri döndürecek.

Şimdi, Cihan Özhan’ın Ali Veli’ye 500 tl göndermesini sağlayacak prosedür çağrımını yapalım.

1
2
3
DECLARE @rVal INT;
EXEC sp_MoneyTransfer '0000064219','0000065127',500, @rVal out;
SELECT @rVal;

Bu tür prosedürlerde bir çok işlem kontrol edilir. Ancak biz sadece gönderen kişinin hesabında göndermek istediği kadar miktar olup olmadığını kontrol ettik.

Alintidir.

Kaynak: http://www.cihanozhan.com/sql-serverda-transaction-kullanimi-yonetimi/

Kaynak : Yazılımcılar İçin İleri Seviye T-SQL Programlama

Asp.net Mvc Highchart örneği

Json Verisi ile Dinamik Olarak HighChart Oluşturmak

ALİ ÖZDEMİR

Herkese merhaba,
Bugün sizlere asp.net mvc de highchartlar nasıl dinamik yapılır bunu göstermek istiyorum. HighChart nedir diyorsanız bu siteyi ziyaret edebilirsiniz. http://www.highcharts.com/
Sizler için 2 tane örnek hazırladım. İlki pie chart, diğeri column chart.
Öncelikle pie chart ile başlayalım.
Önce controllerda view tarafı için gerekli verimizi ayarlıyoruz. Kodlar şu şekilde,
public class Data
{
public string Name { get; set; }

public int Count { get; set; }
}

View tarafından ajax ile istekde bulunacağımız metod
public JsonResult GetData()
{
List list = new List()
{
new Data(){ Name = "Elma", Count=20 },
new Data(){ Name = "Portakal", Count=30 },
new Data(){ Name = "Ceviz", Count=10},
new Data(){ Name = "Muz", Count=10 },
new Data(){ Name = "Kahve", Count=30 },
};
return new JsonResult() { Data = list, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
}

View tarafında ise ekranımıza bir tane button ve bir tane div atıyoruz. Butona basıldığı zaman pie chart ın…

View original post 102 kelime daha

Unit Testte Action’ın Modelin’inin Veri Türüne Erişim

Action methodlarından dönen modelin türü, durumlara göre farklı olabilir. Biz bu action methodundan dönen modelin tipini test etmek isteyebiliriz modelimizde. Bunun için Assert.InstanceOfType test methodu ile actiondan dönen modelin türünü karşılaştırabiliriz. Örnek action methodumuz şöyle olsun:

public ActionResult Urunler()
{
   return View(new List());
}

Test Methodumuz:

[TestMethod]
public void Urunler_Liste()
{
   HomeController controller = new HomeController();
   ViewResult sonuc = controller.Urunler() as ViewResult;
   Assert.IsInstanceOfType(sonuc.Model, typeof(List));
}

Unit Test Json Türündeki Verilen Testi

Action methoddan Json türünde veri döndürmemiz gereken durumlar olabilir. Bu durumların testleri yapılırken actiondan alınan veriler orjinal türüne dönüştürülüp olması gereken değerle, özellik bazında değerler karşılaştırılarak sonucun doğruluğu kontrol edilebilir.

Controllerda Json tipindeki Action Methodu:

public JsonResult JsonUrun()
        {
            var urun = new Urun
            {
                Id = 1,
                Ad = "Bilgisayar",
                Fiyat = 2000
            };
            return Json(urun);
        }

Unit Testteki test methodumuz:

[TestMethod]
        public void UrunJson_Test()
        {
            HomeController controller = new HomeController();

            var urun = controller.JsonUrun();
            var sonuc = urun.Data as Urun;
            var olmasiGereken = new Urun
            {
                Id = 1,
                Ad = "Bilgisayar",
                Fiyat = 2000
            };
            Assert.AreEqual(sonuc.Id, olmasiGereken.Id);
            Assert.AreEqual(sonuc.Ad, olmasiGereken.Ad);
            Assert.AreEqual(sonuc.Fiyat, olmasiGereken.Fiyat);
        }

Bu şekilde test methodu içerisinde tanımladığınız bir nesneyle, controllerdan elde ettiğiniz json tipindeki nesneyi birbiriyle eşitleyerek karşılaştırmasını yapabilirsiniz.

Bir Solutiondaki Unit Test Projesinde Test Methodu Çalışmadan Önce Kod Çalıştırma

Birden fazla test methodunda ortak kullanılan değişkenlerin oluşturulması ya da test methodu çalışmadan önce çalıştırılması gereken farklı methodlar olabilir. Bu durumlarda TestInitialize attribute’u kullanılır.

Örneğin HomeController sınıfında yapılan Unit Testlerin bulunduğu test sınıfındaki tüm test methodlarında HomeController türünden bir değişken oluşturulup bu değişken üzerinden testler yapılabilir. Her test methodu içinde bu değişkeni tekrar tekrar oluşturmak yerine test methodu çalışmadan hemen önce bir kere bu değişkeni tanımlayıp tüm methodlarda kullanmak daha mantıklı olacaktır.

[TestClass]
public class HomeControllerTest
{
HomeController controller;

[TestInitialize]
 public void Initialize()
 {
 controller = new HomeController();
 }

[TestMethod]
public void Index()
{
ViewResult result = controller.Index() as ViewResult;

string isim = result.ViewBag.Isim;

Assert.IsNotNull(result);
}

[TestMethod]
public void About()
{
ViewResult result = controller.About() as ViewResult;
Assert.AreEqual("Your application description page.", result.ViewBag.Message);
}

}

Kodlamayı tamamladıktan sonra sonra Test Explorer üzerinden 3 methodu da çalıştırdığınızda Initialize methoduna breakpoint eklerseniz her methoddan önce bir kez bu methodun çalıştığını göreceksiniz.

DataTables Kullanımı

DataTables Kullanımı

ALİ ÖZDEMİR

Web projeleri geliştirilirken en çok kullanılan kontrollerin başında şüphesiz verilerin gösterileceği gridler gelir.Bu nedenle bugün sizlere DataTables hakkında bilgi vermek istiyorum.
DataTables geliştiricilere kod yazmadan; sıralama, sayfalama, çıktı alma gibi özellikler sunabilen özelleştirilmiş bir kontroldür. Detaylı bilgi için http://www.datatables.net/ bu siteyi ziyaret edebilirsiniz.

Örneğimiz herhangi bir kaynaktan edindiğimiz verileri bir tablo üzerinde sergilemek.
Asp.net mvc projemde bir view sayfam ve burada ise bir tablo var. Kodlar şu şekidle,

<table id=”tblCustomer” class=”table table-striped table-bordered”>
<thead>
<tr>
<th>
Adı
</th>
<th>
Yaşı
</th>
<th>
Adres
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Age</td>
<td>@item.Address</td>
</tr>
}
</tbody>
</table>
Daha sonrasında ise sayfama DataTable ın özelliklerini kullanabilmem için script kodlarımı ekliyorum.

@section scripts{

$(document).ready(function () {
$(‘#tblCustomer’).dataTable();
});

}

Yukardaki kodda da görüldüğü gibi tblCustomer idsine sahip olan tabloyu datatable yap diyoruz.Çıktı aşağıdaki gibi oluyor.

DataTablesImg

DataTable ayrıca bootstrap ile geliştirilmiş projelere çok uygun. Örnek olarak buraya bakabilirsiniz.
http://www.datatables.net/manual/styling/bootstrap

View original post