Microsoft SQL’de herhangi bir tabloya veri eklemenin bir çok yolu vardır. Bir tabloyu edit modunda açarak manuel olarak elle girerek tablo üzerinde ilgili kolonlara ekleyebiliriz mesela. Ama ben bu yazımda T-SQL yani kod ile veri ekleme nasıl yapılır buna değinmek istiyorum. Çünkü her zaman SQL Server Management Studio kullanılmaz, özellikle yazılım uygulamarımızda, WEB uygulamalarımızda oluşturduğumuz projelerde veri kaydı yapabilmek için ilgili aplikasyonu kullanırız. Yani onun üzerinde yer alan örneğin bir butona basmak sureti ile kayıt yaparız. Dolayısı ile bizim için önemli olan işin kodsal anlamında nasıl yapıldığının bilinmesi. Şimdi bu yazıma devam etmek için ben AdventureWorks2012 veri tabanı üzerinde bir tablo oluşturacağım. Bunu da kodla oluşturuyorum.
1
2
3
4
5
CREATE TABLE MusteriDemo
(MusteriID INT NOT NULL PRIMARY KEY,
Ad NVARCHAR(50) NOT NULL,
IkinciAd NVARCHAR(50),
Soyad NVARCHAR(50) NOT NULL);
Bu kod ile ben MusteriDemo adında MusteriID, Ad, IkinciAd ve Soyad kolonlarına sahip bir tablo oluşturdum. Tablomda MusteriID alanı NOT NULL diyerek boş geçilemez be INT tipinde bir PRIMARY KEY yaptım. Ad, IkinciAd ve Soyad kolonları ise NVARCHAR tipinde ve 50 karakter alanına sahip kolonlar. Bunlarda da Ad ve Soyad alanı boş geçilemez dedim. Sorgumu çalıştırdığımda Command(s) completed successfully. bilgisini alırım. Böylelikle tablom oluşturulmuş olur. SQL Server Management Studi üzerinde AdventureWorks2012 veritabanı üzerinde sağ tıklayıp refresh dediğimde tables altında artık ben oluşturduğum MusteriDemo tablosunu görebilirim.
2013040206
SQL için veri eklemenin en basit kod metotlarından birisi her bir sorguda tek bir satır için veri eklemektir. Örneğin kullanıcın bir WEB form ya da windows form doldurup daha sonra kaydet tuşuna basması. Bu tek bir komut ile tek satır verinin kaydıdır aslında. Burada SQL Server’a tek bir INSERT komutu yollanır. Yeni veri girebilmek için bir başka INERT komutunun yollanması gerekir. Tek satırda bilgi girmenin iki söz dizimi vardır:
INSERT INTO tabloAdı (kolon1, kolon2) SELECT değer1, değer2;
Diğeri;
INSERT INTO tabloAdı (kolon1, kolon2) VALUES (değer1, değer2);
Bu söz dizimlerinde görüleceği üzere INTO kısmını koyu yaptım. Burada değinmek istediğim bir nokta var, INTO kısmını kullanmak şart değil. Yani sadece INSERT dememiz de yeterli. Ama genelde INSERT INTO birlikte kullanılırlar. Ayrıca veri eklemek içinde genelde ikinci sırada vermiş olduğum VALUES ile değerlerin belirtilmesi daha çok tercih edilir. Tabi bunlar zorunluluk değil.
Şimdi farklı metotlarda veri gireceğim. Bazılarının ikinci adı olacak bazılarının olmayacak.
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES (1,'İsmail','GÜRSOY');
MusteriDemo tablosuna MusteriID alanına 1, Ad alanına İsmail ve Soyad alanına GÜRSOY girdim. IkinciAd kolonuma değer vermedim dolayısı ile onu kodda kullanmadım. Bu kodda INSERT INTO kullandım ve VALUES kullandım. Bir diğer yöntem:
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
SELECT 2,'Gözde','Pınar','HATTAT';
MusteriDemo tablosuna MusteriID alanına 2, Ad alanına Gözde, IkinciAd alanına Pınar ve Soyad alanına HATTAT girdim. Dolayısı ile bu sefer parantez içi kısımda 4 kolonun adını da belirttim. Bu kodda INSERT INTO ile birlikte SELECT kullandım. Dolayısı ile SELECT sonrası parantez yok.
1
2
INSERT dbo.MusteriDemo (MusteriID,Ad,Soyad)
SELECT 3,'Kamil','ASLAN';
MusteriDemo tablosuna MusteriID alanına 3, Ad alanına Kamil ve Soyad alanına ASLAN girdim. Dolayısı ile parantez içi kısımda bu sefer IkinciAd alanımı yazmadım. Sadece INSERT ile birlikte SELECT kullandım. Dolayısı ile SELECT sonrası parantez yok ve INTO başta yer almıyor.
1
2
INSERT dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (4,'Remziye','Didem','ELBİSECİ');
MusteriDemo tablosuna MusteriID alanına 4, Ad alanına Remziye, IkinciAd alanına Didem ve Soyad alanına ELBİSECİ girdim. Dolayısı ile bu sefer parantez içi kısımda 4 kolonun adını da belirttim. Bu kodda INSERT ile birlikte VALUES kullandım, dolayısı ile değerler parantez içinde ve INSERT sonrası INTO yok.
Görüleceği üzere farklı şekillerde yazabiliyoruz ama en çok kullanılanı INSERT INTO ve VALUES şeklinde olanı. Şimdi 6 satır daha veri giriyorum ve bunları ayrı ayrı açıklamıyorum. Sadece tüm kolonların dolduğu ve dolmadığı durumlara dikkat edin. Dolması gerekenlerde 4 kolonuda yazıyorum, istemediklerimde sadece 3 ü. Çünkü hepsinin ikinci adı yok, zaten tablo oluştururken de IkinciAd kolonu için NULL değer alabilir demiştik.
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (5,'Veli','Ali','ARABACI');
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES (6,'Aslı','YAŞAM');
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (7,'Servet','Muhammed','KURTULUŞ');
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (8, 'Nalan','Aysun','KALP');
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES (9, 'Burhan','SUSAM');
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES (10, 'Nesrin','REKOR');
Bir tane de şöyle bir örnek yapalım. INSERT INTO kullanalım 4 kolonuda tanımlayalım ama değer girmeyelim yerine NULL yazalım. O zaman şöyle yazmamız gerekir:
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (11,'Esra',NULL,'ÇEKİMSER');
Görüleceği üzere 4 kolonuda verdim ancak, Esra ikinci bir ad olmadığı için NULL yazdım. Eğer NULL yazmasa idim ve 4 kolonu da tanımlamış olsa idim hata alırdım.
Birde hiç alan tanımlamadan tablomda 4 tane alanım olduğu için bu 4 alana sıra ile verileri girerekde kayıt yapabilirim. Burada kural eğer alan tanımlamaz isek mutlaka alan sayısı kadar uygun veri tiplerinde verilerin girilmesidir. Bunu INSERT INTO ve VALUES, INSERT INTO ve SELECT ile birlikte yapalım. Ayrıca sadece INSERT ve VALUES ve INSERT ve SELECT ile yapalım. Girmeyeceğim alanlara NULL yazarım, girilecek alanları belirtirim.
1
INSERT INTO dbo.MusteriDemo VALUES (12,'Erdinç',NULL,'HUKUKÇU');
1
INSERT INTO dbo.MusteriDemo VALUES (13,'Gamze','Oya','REFAH');
1
INSERT INTO dbo.MusteriDemo SELECT 14,'Orhan','Kadir','İNANÇ';
1
INSERT INTO dbo.MusteriDemo SELECT 15,'Barçın',NULL,'DESTEKÇİ';
1
INSERT dbo.MusteriDemo VALUES (16,'Mehmet',NULL,'ARAŞTIRMACI');
1
INSERT dbo.MusteriDemo VALUES (17,'Pakize','İnci','TALİHLİ');
1
INSERT dbo.MusteriDemo SELECT 18,'Ferit','Rahmi','ÇELİK';
1
INSERT dbo.MusteriDemo SELECT 19,'Ayşe',NULL,'EREN';
Şimdi hepsini listeleyelim bakalım 19 kayıt var mı?
1
SELECT * FROM dbo.MusteriDemo;
2013040207
Şimdi doğru kodları yazdık, birde hatalı kodları nasıl yazıyoruz, bunu görelim.
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad)
VALUES (1, 'Sezen','Seren','DEMİRCİ');
Dediğimde şöyle bir hata alırım.
Violation of PRIMARY KEY constraint ‘PK__MusteriD__7262447180FC1418′. Cannot insert duplicate key in object ‘dbo.MusteriDemo’. The duplicate key value is (1).
The statement has been terminated.
Bu şu demek. Ben MusteriID alanını Primary Key olarak tanımladım. Dolayısı ile bu alandaki bir değer aynı tablo içinde başka bir değerle asla benzer olamaz. Ben burada 1 değerini verdiğim için ve tabloda daha önceden 1 değeri ile kayıtlı başka bir kayıt bulunduğu için hata alıyorum. Ayrıca Primary Key özelliğine sahip kolonlara NULL değerde verilemez. Burada hata Primary Key kısıtlaması nedeni ile çıkıyor yani.
Bir başka sorgu :
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, IkinciAd, Soyad)
VALUES (20,'Berru','DAVOS');
Aldığım hata :
Cannot insert the value NULL into column ‘Ad’, table ‘AdventureWorks2012.dbo.MusteriDemo'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Burada bu hatayı almamın sebebi şu. Ben tablomu oluştururken Ad kolonu için NOT NULL dedim, yani NULL olarak, boş olarak geçilemez. Oysaki sorgumda ben alanlar içinde Ad kolonunu belirtmiyorum. Dolayısı ile hata kaçınılmaz. Aynı durum Soyad kolonu içinde geçerli, eğer Soyad kolonuda tanımlanmamış olsa ya da Ad tanımlanmış ama Soyad tanımlanmamış olsa idi aynı hatayı alırdım.
Bir diğer sorgu
1
INSERT INTO dbo.MusteriDemo VALUES (20,'Yılmaz','ARABACI');
Bur sorgum sonucu aldığım hata : Column name or number of supplied values does not match table definition.
Ben tablomu tanımlarken 4 tane alan verdim. Sorgumda hangi alanlara kayıt yapılacağını belirtmemişim. Ve sadece 3 tane veri kaydetmeye çalışıyorum. SQL burada hangisini nereye kaydedecek bilemez. Dolayısı ile tanımlama eksikliği mevcut. Eğer 4 tanesini verse idim, uygun sırada verdiğim takdirde o zaman kayıt yapardı. Keza yukarıda böyle bi örnek yaptım.
Bir diğer sorgu :
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES (20,'Halime',NULL,'TEPE');
Aldığım hata : There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
Ben INSERT alanında burada 3 kolon adı veriyorum ancak VALUES kısmında 4 veri alanım var. Bu da hataya sebebiyet verir. Yani INSERT alanında belirttiğim alan sayısından fazla veri sayı olması da bir hatadır.
1
2
INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad)
VALUES ('A','Kadriye','ÇEVRE');
Aldığım hata : Conversion failed when converting the varchar value ‘A’ to data type int.
Ben tablomu oluştururken MusteriID alanı için INT yani integer tipinde veri alabilir dedim. Oysa burada yolladığım değer A değeri. SQL bunu int değere çevirmeye çalışıyor ancak başarılı olamıyor, dolayısı ile hata alıyorum.
Görüleceği üzere tablolara tek satır üzerinden veri aktarmak oldukça basit ancak dikkat edilmesi gereken noktalar var. Bu yazıda nasıl veri kaydedileceğini ve olası sıkça karşılaşılabilecek hatarlı elimden geldiğince aktarmaya çalıştım. Tabi hatalar asla bu kadar sınırlı değil ama hepsini yansıtabilmek mümkün değil.
Sorgularımızı yazarken dikkatli olmalıyız.

SQL Kayıt Ekleme(İnsert İnto)

Asp.Net MVC de en çok arama yapılan kısımlardan biriside şüphesizlik FileUpload olayıdır.  aslında bu kısım çok kolay yapmamız gereken post ettiğimiz Controller a bir değişken eklemek. sonrada oradan dosyayı yakalayıp kaydetmek.

[HttpPost] // Bu kısım controller'ın sadece Post edildiğince çalışmasını sağlar.
public ActionResult UploadFile(HttpPostedFileBase fileData)
{
     /***** dosya kayıt başlangıç ***/
     if (fileData != null && fileData.ContentLength > 0)
     {
          fileData.SaveAs(Server.MapPath(@"/files/" + fileData.FileName));
     }
     /***** dosya kayıt bitiş ***/
     // diğer işlemlerinizi öncesinde, sonrasında yada hem öncesinde hem sonrasında yapabilirsiniz.

     return Json(true); // Burada geri json data içinde true dönüyoruz. isteğe göre farklı datalarda dönmek mümkün.
 }

Asp.Net MVC File Upload

MD5  tek yönlü bir şifreleme algoritmasıdır. Girilen verinin boyutu ne olursa olsun 128 bitlik bir veri çıkartır.

bunun için System.Security.Cryptography kutüphanesini kullanmamız gereklidir.


public static string MD5Sifrele(string metin)
{
     // MD5CryptoServiceProvider nesnenin yeni bir instance'sını oluşturalım.
     MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
     
     //Girilen veriyi bir byte dizisine dönüştürelim ve hash hesaplamasını yapalım.
     byte[] btr = Encoding.UTF8.GetBytes(metin);
     btr = md5.ComputeHash(btr);

     //byte'ları biriktirmek için yeni bir StringBuilder ve string oluşturalım.
     StringBuilder sb = new StringBuilder();

     //hash yapılmış her bir byte'ı dizi içinden alalım ve her birini hexadecimal string olarak formatlayalım.
     foreach (byte ba in btr)
     {
          sb.Append(ba.ToString("x2").ToLower());
     }

     //hexadecimal(onaltılık) stringi geri döndürelim.
     return sb.ToString();
}
yukarıdaki function ile şifreleme yapabiliyoruz. şifrelemek istediğimiz veriyi bu function a yolladığımızda geriye şifrelenmiş halini döner. unutmamak lazım tek yönlüdür. şifrelenen veri geri dönüştürülemez.
string sifre = MD5Sifrele("testt");

Console.Write(sifre);
yaptığımız da ekrana “a103938b6563207cbf208d8bf8b042d0″ yazacaktır.

doğru çalıştığınız test etmeniz için örnek bir kaç data :
DataMD5 ile şifrelenmiş Data
erkandursuna103938b6563207cbf208d8bf8b042d0
1231234297f44b13955235245b2497399d7a93
şifre123!*+2b69d44459afddb70bb6d2036709b00e
test-+/*!’^+%5567889651test*erkandursun-com063e2f82000f53b99c578e337aafb4f2
- See more at: http://www.erkandursun.com/blog/index.php/c-md5-ile-sifreleme/#sthash.u7DQIred.dpuf

C# MD5 İle Şifreleme

C# ile random(rastgele) kod üretmek için tek yapmanız gereken aşağıdaki fonksiyona kodun kaç karekter olacağını bildirmek. Fonksiyon, “chars” değişkeni içindeki karakterleri kullanarak size kod üretir. O karakterleri isteğinize göre arttırıp azaltabilirsiniz.
Örneğin sadece rakamdan oluşmasını istiyorsanız “123456789″ olarak güncelleyebilirsizin. :) hepsi bu kadar
public static string GenerateCode(int lenght)
        {
            const string chars = "123456789ABCDEFGHIJKLMNPRSTUVYZ";
            var code = "";
            var rn = new Random();
            for (int i = 0; i < lenght; i++)
            {
               var row = rn.Next(0, chars.Length-1);
                code += chars[row];
            }
            return code;
        }
- See more at: http://www.erkandursun.com/blog/index.php/c-da-random-rastgele-kod-uretmek/#sthash.6dTI4jq7.dpuf

C# da random (rastgele) kod üretmek

Diyelim ki bir alana max 200 karakterli bir haber özeti gireceksiniz ama haber metni 800 karakter. sizde kırpıp koymaya karar verdiniz. Fikir güzel ama 200 karakteri çat diye kesince sondaki kelime istenmeyen bir yerden kesilebilir ve bu kesilme sonucu istenmeyen sonuçlar çıkabilir.
Örnek verecek olursak; metin şöyle devam ediyor. “… xxxxx bey malları teslim ettikten sonra …” şimdi bunun tam 200. sıradan kestiğinde ” … xxx bey mal” diye kesme ihtimali var. :) bu gibi durumların önüne geçmek için kullanılacak en sağlıklı yöntem kesimi boşluğa denk getirmek olacaktır. hah işte tam burada aşağıdaki fonksiyon işinize yarıyor. mini kod parçası büyük yanlış anlamaları önlemeye yarıyor :) cümleyi ve max kaç karakter olması gerektiğini söylüyorsunuz o size en son boşluktan kesip veriyor :)
public static string Substring(string text ,int maxLength)
{
var newText = text;
if(text.Length > maxLength)
{
var index = text.IndexOf(" ", maxLength, StringComparison.Ordinal);
if(index >=0)
newText = text.Substring(0, index);
}
return newText;
}
- See more at: http://www.erkandursun.com/blog/index.php/c-cumleyi-bosluktan-kesme/#sthash.OeFi0JGk.dpuf

C# cümleyi boşluktan kesme(SubString)

SQL de kullanılan WHILE döngüsü tekrarlanması gereken işlemlerde istenilen şart gerçekleşinceyedek işlem yapmaya olanak sağlar.
Kullanımı
?
WHILE şart
 BEGIN
 Tekrarlanması gereken kodlar
 END
Örnek:
?
DECLARE @toplam int
 DECLARE @sayac int
SET @toplam =0
 SET @sayac = 1
WHILE @sayac < 10
 BEGIN
 SET @sayac+=1
 SET @toplam+=5
 PRINT(CAST(@toplam as varchar(10)))
 END

SQL While Döngüsü Kullanımı

Sql Server‘da o an çalışan sorguları aşağıdaki T-Sql query’si ile listeleyebilirsiniz.
?
 
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
db.name,
er.session_id,
er.transaction_id,
er.start_time,
er.status,
er.command,
er.wait_time
FROM
sys.dm_exec_requests AS er
JOIN sys.sysdatabases AS db ON er.database_id = db.dbid
WHERE
er.status = 'running'

Sql Server’da Çalışan Sorguları Listeleme