SQL Update Join Kullanımı



Merhaba bu yazımızda çok işinize yaracak bir Update kullanım şeklini anlatacağım.

Bizim kadar çok kayıt düzeltmesi yapıyorsanız kesinlikle ihtiyacınız olacak ve hayat kurtaracaktır.
Sorgularda kullandığımız Join syntax ı aynen geçerlidir. Önce syntax ı verelim sonra da örnekle bitiririz.

Kullanımı:

UPDATE 
table1  SET kolon1 = ifade 
FROM tablo1  
INNER JOIN tablo2 ON tablo1.kolon1 = tablo2.kolon1
WHERE kriter


Örnek:

Bu örnekte Sipariş tablosundaki Sevk Tarihi ile Sevkıyat  tablosundaki tarihlerin uyumsuz olanları eşitledik

UPDATE 
Siparis SET SevkTarihi = Sevkiyat.Tarih 
FROM Siparis
INNER JOIN Sevkiyat ON Siparis.ID = Sevkiyat.SiparisID
WHERE Sevkiyat.SevkTarihi != Sevkiyat.Tarih


Konu bu kadar kolay.

SQL Hata Çözümü - Cannot open user default database. Login failed. Login failed for user



Arkadaşlar merhaba;

Bu yazımızda SQL ile ilgili çok sık olmasa karşılaşabileceğimiz bir hatanın çözümüne bakacağız.

"Cannot open user default database. Login failed. Login failed for user" 



      SQL Hatası derken baştan söyleyelim bu hatanın sebebi yüksek ihtimalle bizden kaynaklıdır.
Yani kullanıcı ya varsayılan olarak atanan Database in silinmesinden kaynaklı bir hata.

Çözümüne gelecek olursak hızlıca anlatalım.

1. Adım: Kullanıcı giris ekranının da Options (Seçenekler) butonuna basıyoruz.


2. Adım: Connetion Properties (Bağlatı Özellikleri) sekmesine gidiyoruz.

,
3. Adım: Data sonra database listesinden istediğiniz bir database i seçebilirsiniz. Ben gelde  master veya msdb veritabanlarından birini seçiyorum.



4. Adım: Son olarak Login (Giriş)  yapabilirsiniz. 

İşlem tamam... umarım işinize yarar.





SQL Server Linked Server Kullanımı ve Dağıtık Sunuculara Erişim

Arkadaşlar merhaba;
Bu yazımızda elimizden geldiğince SQLde Linked Servers ve Dağıtık Sunuculara Erişim konusunu anlatmaya çalışacağız.

İsterseniz önce Distributed Systems olarak da anılan  Dağıtık Sunucu (Sistem) nedir? bunu özetlemekle başlayalım.

 Dağıtık Sistemler (Distributed Systems)


       En basit özet anlatımıyla, çeşitli iletişim protokolleriyle erişebildiğimiz, üzerin de veri barındıran farklı konumlara sahip veri kaynaklarıdır.

       Bu veri kaynakları aynı sunucu üzerinde farklı path larde bulunabileceği gibi farklı sunucular üzerinde hatta dünyanın farklı  ülkelerinde bile bulunabilirler. Üstelik bu kaynakların aynı türde de olmayabilirler. Verilerin bir kısmı SQL server üzerinde tutulurken bir bunu destekleyen başka bir veri başka bir sunucuda, Excel ya da Text dosya üzerinde olabilir. Zaman zaman bu verilere erişip bir araya getirerek aynı amaç doğrultusun da birleştirip anlamlı veriler ya da raporlar oluşturmamız beklenir.

İşte bu noktada Linked Servers devreye girer ve bize bu farklı yapılar arasında iletişim imkanı sunar.

Not: Dağıtık Sistemler aynı zaman da BigData konusuna da girer. BigData çok başka bir konudur karıştırılmalıdır Detayları için araştırmanızı tavsiye ederim.

Konuyu detaylı olarak açıklayan makale örnekleri de mevcut, biz anlaşılır bir dille özetlemeye çalıştık.


 Linked Servers

Linked Servers yöntemi temel olarak OLEDB veya ODBC protokolleriyle erişim sağlar.

Dilerseniz artık yavaş yavaş serverlar arası link kurarak verileri erişmeye başlayalım.

Linked Server oluşturmanın iki yolu vardır. 
Bunlarda birisi SQL Server Management arayüzünden sihirbazlarla oluşturmak,
diğeri ise SQL içerisinde mevcut olan  Stored Procedure kullanarak oluşturmak.


Object Explorer/Server Objects/Linked Servers/New Linked Server














Yolu izlediğiniz de Tanım ekranı çıkar.

































Resimde zaten alanların ne olduğu nasıl doldurulacağı belirtildi.
        Peki elimizi kolumuzu sallayarak servere erişemeyeceğimize göre Kullanıcı adı ve parolayı nereye gireceğiz.
Evet doğru!!!  Security sekmesinden Kullanıcı ve Parolanızı girmeniz gerekiyor.
Ayrıca diğer bazı ayarlar içinde Server Options sekmesine göz atmanızı tavsiye ederim. Ne oldukları açık oldukları için tek tek değinmiyorum.

Eğer bütün ayarlarımız tamam sa OK diyerek kaydediyoruz.

        Son olarak oluşturduğumuz Linked Server'in üzerinde sağ tuş "Test Connection" diyerek testini yapıyoruz ve işi bitiriyoruz.



C# Environment Sınıfı Kullanımı



Arkadaşlar merhaba bu yazımızda hayli işe yarayan Environment Class ını inceleyeceğiz.

Bu sınıf adında anlaşıldığı gibi Environment Variables yani Ortam Değişkenleri adı verilen bilgilere ulaşmanın en kısa yoludur.
Peki ortam değişkenleri denildiğinde ne anlamalıyız.
Bunlar resimde de gördüğünüz yazılımlara sistem path leri ve parametreleri hakkında bilgi veren, işletim sisteminin neyi nerede barındıracağı bilgisini tutan değişkenlerdir. Örnek olarak TEMP klösörü, Desktop vs... nerede gibi daha bir çok bilgi içerir.
Burada değişken denilmesinde ki sebep gerçekten değiştirilebilir yani eklenebilir silinebilir ve değiştirebilir olmasıdır. Özel sebeplerden dolayı sistem yönetici bu değişikliğe gidebilir.
Bu ekrana da Win8 için Bilgisayarım/Özellikler/Gelişmiş sistem ayarları/Ortam değişkenleri yolunu izleyerek ulaşabilirsiniz.



















İsterseniz şimdi makalenin konusu olan .Net (C#) içerisinden bu bilgileri nasıl ulaşabiliriz ona bakalım.

İşimiz çok kolay System namespace altında bulunan Environment Sınıfını işe dahil etmek yeterli.
Bu sınıf static olduğu için herhangi bir instance almaya gerek yok direk kullanabiliriz.
Peki bize hangi bilgileri veriyor açıklayarak sıralayalım.

  Environment.CommandLine; //Uygulanın çalıştırıldıgı komutsatırı
  Environment.TickCount; //Sistem başladığından beri geçen milisaniye sayısı
  Environment.StackTrace; //Uygulama çalıştırıldıgında oluşan StackTrace dediğimiz bilgileri verir. Bu bilgiler aynı zaman da visual studia ekrana yansıyan hatalarda ki StackTrace bilgisidir.
   Environment.SystemDirectory; //Sistem dizinin tam yolunu (C:\Windows\system32) verir.
   Environment.UserDomainName; //Kullanıcı Domain Adı.  
   Environment.Version; //CLR versiyon numarası
   Environment.OSVersion.VersionString; //İşletim sistemi 
   Environment.UserName; //Kullanıcı adı
   Environment.MachineName; //PC adı
   Environment.CurrentDirectory; //Uygunlamamnın çalıştıgı aktif klasör yolu
   Environment.ProcessorCount; //Çekirdek sayısı

Environment.SpecialFolder Enum unu kullanarak bir çok özel klasöre erişebilirsiniz.
Ben hepsini tek tek sıralama gereği duymadım ne oldukları zaten açık.
Örnek olarak ;
Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //Masaüstü yolunu verir.

Ayrıca;

Environment.SetEnvironmentVariable("değişken", "değer"); ile değişkenlere değiştire bileğinizi belirtmek istiyorum. Ben bu metodu hiç kullanmadım dip not olarak vereyim.

Faydalı olması dileğiyle...



SQL Server da Tablolar Arası Veri Transferi

SQL SELECT INTO - INTO SELECT


Arkadaşlar merhaba bu yazımız da sql server da, sql komutlarıyla veri transferi konusuna bakacağız.

Bilindiği gibi sql serverda veri taşımanın bir çok yolu var bunların en çok kullanılanları şüphesiz Management Studio nun export/import araçlarıdır.

Ama biz bugün daha öncede bahsettiğim gibi sql scriptleriyle halledebilmenin yollarına bakacağız.
Evet bunun için iki şekilde yapabiliriz
Önce kendimize tablo oluşturarak işe başlayalım.

CREATE TABLE [dbo].[Musteri](
[id] [int] IDENTITY(1,1) NOT NULL,
[Adi] [varchar](50) NULL,
[Soyadi] [varchar](50) NULL,
[Telefon] [varchar](20) NULL
) ON [PRIMARY]

Tablomuzu oluşturduk sıra veri girmeye geldi.

INSERT INTO [dbo].[Musteri] ([Adi],[Soyadi],[Telefon])
VALUES ('Ahmet','CAN','0532988888')

Siz dilediğiniz sayıda kayıt ekleyebilirsiniz.

Şimdi hazırlıklar tamamlandığına göre data transferine başlayabiliriz.

I. Yöntem:
SELECT * INTO Yeni_Musteri FROM Musteri

Bu yöntem de Musteri tablosunda ki kayıları select eder ve Yeni_Musteri adında yeni bir tablo oluşturur ve select ten gelen veriyi insert eder.

Burada SELECT işlemi bildiğimiz sorgulama işlemidir. Belli kriterlere sahip veriyi aktarmak isteyebilirsiniz bunun için WHERE yazmamız yeterli olacaktır.

II. Yöntem:

INSERT Yeni_Musteri2 (Musteri_Adi, Musteri_Soyadi)  SELECT Adi,Soyadi FROM [Musteri] 

Bu yöntemde de zaten var olan bir tablonun içine belli alanları eşleyerek insert yapıyoruz. Yine Select kısmına filtre uygulayabiliriz.
 Burada dikkat edilecek bir husus var.  Eşleştirilecek kolonlar aynı sırayla yazılması gerekiyor yani kaynak alan ve hedef alan aynı sırada olmalı. 

Diğer bir önemli noktada; dikkat ederseniz biz bu yöntemde ID alanlarını taşımadık. Bildiğiniz gibi IDENTITY alanlara kayıt yapamıyor ve düzenleyemiyoruz. 
Peki ID numaralarıyla birlikte taşımak istersek ne yapmamız gerekiyor?

Çözüm:

IDENTITY alanlarının müdahaleye açık hale getiriyoruz.

SET IDENTITY_INSERT Yeni_Musteri2 ON 
            INSERT Yeni_Musteri2 (ID, Musteri_Adi,Musteri_Soyadi)  SELECT ID, Adi,Soyadi  FROM [Musteri] 
SET IDENTITY_INSERT Yeni_Musteri2 OFF


Son olarak bir tavsiye de bulunmak istiyorum. Bu transfer işlemlerinde transaction çalıştırarak yapın. Bir sıkıntı oluşacak olursa uzun aktarım işlemi tekrardan yapmak zorunda kalmazsınız ve veri tutarlılığını korumuş olursunuz. Transaction konusunu da ayrıca ele almayı düşünüyorum.

Faydalı olması dileğiyle.


SQL COALESCE Kullanımı


Merhaba arkadaşlar zaman buldukça yine bir şeyler paylaşmaya çalışacağım.
Bu yazımızda da sql COALESCE fonksiyonundan  çok kısa bir şekilde bahsetmek istiyorum.

Bildiğiniz gibi sql de boşla NULL aynı şey değil. Bazı durumlarda kolonun kesinlikle bir değer döndürmesini isteriz. Bunun için Null kontrolü yapmak zorunda kalırız. Bunlardan en bariz örneği olarak matematiksel işleri verebiliriz. Hata almamak işlemin durumuna göre kontrol ederek uygun bir değerin gelmesini sağlarız.
Peki bugüne kadar ISNULL yöntemini kullandık farkı nedir?
Farkı şudur arkadaşlar; ISNULL() makalesinde de gördüğünüz gibi  iki parametreyle çalışır, COALESCE  ise birden fazla parametreyle çalışır ve eğer kolon null ise null olmayan ilk parametreyi getirir.
Hemen bir örnekle konuyu toparlayalım.

Kullanımı:
SELECT COALESCE (KoloAdi,'Null sa gelecek bir değer-1 ','Parametre-1 Null sa gelecek bir değer-2',...devam eder...,)

Örnek:
SELECT COALESCE(MusteriKodu,PeroselKodu,'yok')  FROM [dbo].[StokHareket] 

Eğer MusteriKodu null ise PersonelKodunu getirir oda null ise yok yazar. Bu şekilde birden çok kolona göre kontrol yapabilirsiniz ve bazen hayat kurtarır.

Son olarak performans dan da bahsederek bitirmek istiyorum yazıyı.
Tabiki diğer fonksiyonlar gibi sorugulara maliyet yüklüyor ve isnull() fonksiyonuna göre biraz daha yavaş olduğunu gözlemledim. Yanılıyorsam burada doğru sonuçları paylaşabilirsiniz.

Sonra ki bir yazımda görüşmek üzere...


C# Tarih Fonksiyonları



Merhabalar aslında bu makaleyi yazarken amacım hangisi nedir yerine bu metodların ihtiyaç durumlarına göre kullanımlarına  örnekler vermekti. Ama konu o kadar geniş ki bunu daha sonra ki bir zamana erteleme kararı aldım. Ee başlamışken birşeyler anlatarak konuya girmiş olalım.

DateTime dt = DateTime.Now;
DateTime dt2=new DateTime(2011,1,1);

İki tarih arasında ki farkı bulmak:
İki tarihideki fark Subtract() metoduyla bulunur ve TimeSpan tipinden değer döndürür.

TimeSpan tSpan = dt.Subtract(dt2);

İsterseniz TimeSpan olarak dönen değerle şimdi neler yapabiliriz inceleyelim.
Aşagıdaki örneklerde farkı gün saat gibi int tipinden alabildiğimizi görüyoruz.

tSpan.Days;
tSpan.Hours;
tSpan.Minutes;
tSpan.Seconds;

belli başlı özellikleri ele aldık eğer inceleresenizdaha fazlası oldugunu göreceksiniz.

Tarihin belli bölümlerini alabiliriz.

dt.Day; Tarihin gün değerini int tipinden döndürür
dt.Month; Tarihin ay değerini int tipinden döndürür.
dt.Year; Tarihin yıl değerini int tipinden döndürür.

Saat dakika saniye cinsinden properties lerin oldugunu artık söylemeye gerek yok sanırım.

Tarih ekleme çıkarma:

dt.AddDays(1); Güne 1 ekledik
dt.AddDays(-1); Gün degerini 1 eksilttik yani düne gittik
dt.AddHours(1); Saate 1 ekledik
dt.AddHours(-1); Saati 1 eksilttik
Ay, yıl, dakika, saniye gibi işlemleri kendiniz deneyebilisiniz.
Sizde fakedeceksiniz ama yinede değinmeden geçmiş olamayalım. Saniye, dakika, gün gibi özeliklere yapılan ekleme ve çıkarmalar direk olarak eğer gün ise tarihin yıl kısmınıda etkileyecektir. Yani 31.12.2010 tarihine 1 gün eklerseniz 01.01.2011 tarihine dönecektir. Aynısı dakika, saat gibi özellikler içinde geçerlidir.

Tarih Formatlama :

Zaman zaman tarihleri farklı formatlarda almak isteriz. Şimdi bunu nasıl yapabiliriz inceleyelim. Uygulanan formatlar ve döndürdükleri string degerler aşağıda yanyana gösterilmekte.

dt.ToString("t");  23:29
dt.ToString("r");  Wed, 04 May 2011 23:29:09 GMT
dt.ToString("T");  23:28:30
dt.ToString("m"); 04 Mayıs
dt.ToString("G");  04.05.2011 23:26:10
dt.ToString("g");  04.05.2011 23:25
dt.ToString("F");  04 Mayıs 2011 Çarşamba 23:24:42
dt.ToString("f");  04 Mayıs 2011 Çarşamba 23:24
dt.ToString("D");  04 Mayıs 2011 Çarşamba
dt.ToString("d");  04.05.2011
dt.ToString("yyyy.MM.dd"); 2011.05.04

Yukarıda uygulanan formatların tamamı String.Format() yönteminde de aynen kullanılabilir.
String.Format("{0:m}", dt); 04 Mayıs

dt.ToLongDateString(); 04 Mayıs 2011 Çarşamba
dt.ToShortTimeString(); 23:19
dt.ToShortDateString(); 04.05.2011
dt.ToString(); 04.05.2011 23:17:08

Başta da dediğim gibi geniş bir konu. İhtiyaça göre bu anlatılan özellikler birçok faklı şekilde kullanılabilir.
Başlangıç için umarım faydalı olmuştur.

Sql Pivot

Merhabalar bu kez sql de az bilinen bir operatörü yani Pivot komutunu incelecegiz.

Pivot komutu Oracle ve Ms Sql gibi SQL tabanlı databaselerin hepsinde vardır.
Normalizasyon kurallarında içinde tasarlanmış tablolar olap şeklinde sorgulamalara izin vermeyebilir. Bu tür durumlar devreye pivot sorgulama girer ve detaylı analiz imakanı verir.

Pivot kısaca ne yapar ?? Tablo da yapısı geregi alt alta sıralanmış olan kayıları yanyana yani sütunlar şeklinde göstermeye yarar.

Sorgu yazmaya başlamadan önce bir konuda sizi uyarmak isterim. Database üzerine pivot sorgu uyğulayabilmek için bir tane prosedürü çalıştırmanız gerekiyor.

sp_dbcmptlevel 'veritabanı_Adı, '90'İsterseniz Prosedürü çalıştırmadan önce isterseniz sorguyu uygulayın nasıl tepki vereceğini, hangi hatayı döndüreceğini görün. Bu size ilerde konuyla ilgili hata çözümünde yardımcı olacaktır.

İsterseniz şimdi sorgumuzu yazalım.

SELECT *
FROM (
SELECT
YEAR(TARIH) [Yıl],
MONTH(TARIH) [Ay],
TOPLAM
FROM SATIS
) TableDate
PIVOT (
SUM (TOPLAM)
FOR [AY] IN (
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
)
) PivotTable


Sorgumuzu yazdık şimdi kısaca açıklayalım.
Satır halinde olan satışları listeler. Satış tarihini ay ve yıl olarak ayırdık. Pivot kısmında da Toplam alanını topladık ve toplamları aylara bölerek gösterdik.

Konuyu biraz araştırırsanız bu işlemin tersini uygulayan UnPivot komutunuda kolayca kavrarsınız.

Artık istedigimiz zaman OLAP mantıgında sorgular çekebilir kullanıcılara daha okunur daha ayrıntılı raporlar sunabilirsiniz.

Umarım faydalı olmuştur.

Using Kullanımı ve Otomatik Dispose()

Merhaba;
Bu makalemizde Using ifadesi kullanımı, nasıl çalıştığını ve bellek yönetimine katkısını incelemeye çalışacagız.

Yazılımda performans ve bellek yönetiminin önemini biliyoruz. Küçük çaplı projelerde .Net CLR (Common Language RunTime) sayesinde kodları çalıştırmak
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.

Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.

Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)

Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.

Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.

Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.

Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.

İsterseniz şimdi kısa bi örnek ile ilerleyelim.

SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}

Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.

Buraya kadar anladık ama using bunun neresinde diyebilirsiniz. Şimdi sıra bunun cevabını vermeye geldi.

using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.

usin ifadesi nesnenin yaşam sürecini belirtir.

using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}

Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.

Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.

Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.

class MyClass:IDisposable
{

public void Dispose()
{
//Dispose kodlarınız...
GC.SuppressFinalize(this);
}
}


Umarım faydalı olmuştur...

Sql String Fonksiyonları

Merhabalar bu makalemizde sıkca kullandığımız Ms Sql string ifadeleri bir araya toplayarak
ne işe yaradıklarını birer örnekle kısaca anlatmak istedim.

Sql tarafında işleri ne kadar iyi çözümlersek yazılım dilleri trafında kodlar o kadar sadeleşiyor ve olası basit değişiklikler söz konusu olduğunda maliyeti oldukca düşürüyor.

LEFT String ifadeden soldan verilen sayı kadarını gösterir.
SELECT LEFT('ŞEBNEM FERAH',3)
Sonuç:ŞEB

RIGHT Stringten sağdan verilen sayı kadarını gösterir.
SELECT RIGHT('ŞEBNEM FERAH',5)
Sonuç:FERAH

LEN Verilen stringin karakter sayısını döndürür. Buna boşluk karakteride dahildir.
SELECT LEN('ŞEBNEM FERAH')
Sonuç:12

UPPER Küçük harfli verilen stringi büyük harflere çevirir.
SELECT UPPER('fatih')
Sonuc: FATİH

LOWER Büyük harfli verilen stringi küçük harflere çevirir.
SELECT LOWER('FATİH')
Sonuç: Fatih

SUBSTRING Verilen stringten parça almak için kullanılır.
Örnekte verilen parametrelere göre 2 den başlayrak 3 tane karakter al demiş olduk.
SELECT SUBSTRING('FATİH',2,3)
Sonuç: ATİ

REPLACE Verilen karakterleri biribiriyle değiştirir.
Örnekte MAKİNİST kelimelerini PİLOT olarak değiştir dedimiş olduk.
SELECT REPLACE('MAKİNİST AHMET','MAKİNİST','PİLOT')
Sonuç:PİLOT AHMET

STUFF 4 paremetre olarak çalışan bu fonksiyon replace fonksiyonu gibi çalışır ama fark olarak karakter olarak değil verilen indexlere göre değiştirme yapar.
SELECT STUFF('Audi hh',5,3,'TT')
Sonuç:AudiTT

LTRIM Soldan boşlukları alır.
SELECT LTRIM(' RAMBO')
Sonuç:RAMBO

RTRIM Sağdan boşlukları alır.
SELECT RTRIM('RAMBO ')
Sonuç:RAMBO

REVERSE stringi ters çevirir.
SELECT REVERSE('RAMBO')
Sonuç:OBMAR

QUOTENAME Verilen string ifadeyi köşeli parantez [] içine almayı sağlar.
SELECT QUOTENAME ('SELECT')
Sonuç:[SELECT]

REPLICATE Verilen string ifadeyi parametre geçilen sayı kadar tekrarlar.
SELECT REPLICATE('0',10)
Sonuç:0000000000

Faydalı olması umuduyla...

SQL Procedure ile Excel den Sql e Aktarımı

Arkadaşlar bu makalemizde SQL Proc ile excel den sql e SQL veri aktarımını incelicez.

Bir çok konuda oldugu gibi bu konuda da bi kaç farklı yöntem uygulanabilir.
Benim ihtiyacım olduduğunda kullandığım yöntemi sizinle paylaşmak istedim.

OPENROWSET teknigini kullanmak için sql serverinizde ikitane servisin aktif halde olması gerekiyor bunlar 'show advanced options' ve 'Ad Hoc Distributed Queries' servisleridir.

Aşagıda gördüğünüz komutları sql çalıştırırak yada Menüden SQL SERVER 2005/Configration Tools altından resimde gödüğünüz gibi tik işaretli olması gerekiyor.



sp_configure 'show advanced options', 1
reconfigure
go
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure

Ayarlarımızı yaptıktan sonra sıra geldi proceduremizi yazamaya.

CREATE PROC XLS_AKTARIM
ASDECLARE @KOMUT NVARCHAR(500)
SET @KOMUT='SELECT * INTO Sayfa1$ FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=C:\test.xls'', [Sayfa1$])'
EXEC( @KOMUT)

Sonuç olarak açıklamamız gerekirse ;
OPENROWSET yöntemini kullanarak Microsoft.Jet.OLEDB.4.0 araçılıgıyla C:\test.xls yolunda ki excele bağlandık ve sanki tabloymuş gibi Sayfa1 deki verileri okuduk.
Select Into ile Sayfa1$ isminde bir tablo oluşturup içine aktardık.

Burda;
Yöntemimiz: OPENROWSET
Sağlayıcımız :Microsoft.Jet.OLEDB.4.0 (Diğer versiyonlar için değişebilir ben office 2003 kullandım.)
Excel versiyonu: Excel 8.0 (Diğer versiyonlar için değişir uygun olanına bakın)
Kaynak Sayfa : [Sayfa1$] (Diğer sayfalar için [Sayfa2$]... olarak değişir)
Hedef Oluşacak Tablo : Sayfa1$ (Siz istediğiniz ismi verebilirsiniz. Ancak veritabanında bu isim varsa zaten kullanımda diye hata verecektir.)

Siz bunu biraz daha geliştirip excel yolunu ve sayfa isimlerini parametre olarak yollayıp daha kullanışlı bir hale getirebilirsiniz.
Konunun sade kalabilmesi için ben o kısmına girmedim.

Umarım faydalı olmuştur.

SQL Procedure ile Dinamik TOPN Sorgusu

Arkadaşlar merhaba;

Bir süredir makale yazmıyordum. Tekrardan bir SQL makale ile giriş yapmak istedim.
Bu yazımızda TOPN komutunun Procudureler aracılığıyla ile parametrik olarak uyğulanmasını işleyeceğiz.

Öncelikle kısaca bir sorgu üzerinde TopN komutu nedir ondan bahsedelim.

SELECT TOP 10 * FROM MUSTERILER
Kullanım şekli böyle olan TOP komutu bize ilk 10 kaydı getirir. TOP 100 yazsaydık ilk 100 kaydı getirirdi.
Peki nerede işimize yarar; ilk aklıma gelen sitemize üye olan ilk 10 kişi kimdir? gibi sorulara cevap verir. Sadece 10 kayıt için bütün kayıtları çekmek çok mantıklı olmayacaktır.

İlk 10 (100) kayıt dedik ama bu herhangi bir ordery by komutu kullanılmazsa ASC yani artan sıralama ile çalışır. Bu durumda ilk N kaydı, order by DESC kullanılırsa son N kaydı getirir.

Bu kadar bilgiden sonra asıl konumuz olan TOPN komutunu parametrik olarak nasıl alınır sorusunu cevaplayalım.

Önce Proceduremizi yazalım:

CREATE PROC TOPN
@ROWCOUNT VARCHAR(10),
@SORTING VARCHAR(3)
AS
DECLARE @KOMUT VARCHAR(MAX)
SET @KOMUT='SELECT TOP '+ @ROWCOUNT +' * FROM MUSTERI ORDER BY ID '+ @SORTING

EXEC (@KOMUT)

Bu kadar olan Procuderemiz iki tane parametre alır.
Birincisi TOP için getirmek istediğiniz kayıt sayısı diğeri ise sıralama yönüdür (ASC veya DESC)

Önceden de bahsettiğim gibi asc kullanırsanız ilk girilen kayıtları desc kullanırsanız son girilen kayıtları getirir.
Query Analyzer da test etmek için
EXEC TOPN 5,'ASC'

Faydalı olması umuduyla... hatıram olsun...

SQL CharIndex Kullanımı

Merhaba arkadaşlar;

SQL üzerinde çalışmalarımız devam ediyor. İlerde komplex procudereler yazarken bizlere lazım olabilecek elemanları yavaş yavaş oluşturmaya başladık.

Şimdi sıra CharIndex() kullanımında. Kullanımı çok basit olan CharIndex() adında anladıgımız gibi bir string ifade içinde başka bi string ifade aramak için ve index no yakalamak için kullanılır.

Hemen bir örnek verecek olursak

SELECT CharIndex('a','fatih')
Eğer aranan karakter( yada karakterler) bulunursa index no, bulunamazsa da 0 dönecektir.
Bu örneğe göre dönecek olan değerimiz dönecek olan değerimiz 2 dir.
(Eğer birden fazla yerde bulunursa ilk bulunan index dönecektir...)
C# VB.NET vs. diller tarafında butür indexlemeler 0 dan başlar ama SQL de direk 1 den başladıgını farketmişsinizdir. Yani bu işlemi .net tarafında karşılıgını yapmış olsaydık dönecek değer 1 oludu.
Biraz daha detaylı bir örnek verecek olursak

DECLARE @returnValue int

SELECT @returnValue=CHARINDEX('a','ADANA')
IF(@returnValue=0)
print 'Aranılan Karakteri içermiyor...'
ELSE
print 'Karakter Index='+ Convert(varchar(10),@returnValue)


SELECT PATINDEX('%T%','FATİH') <-- amaca="" ayn="" eder...="" hizmet="" span="">

Artık lazım olması durumunda nasıl kullanılacagını biliyoruz. Bir süre daha T-SQL üzerine gitmeyi planlanlıyorum.

Şimdilik hoşcakalın...

SQL Trigger (Tetikleyici) Kullanımı

Merhabalar;

T-SQL üzerine gitmeye devam ediyoruz.
Bugün ki konumuz TRIGGER kullanımı.

Sql de veri tutarlıgını sağlamak ve işlemleri otomatikleştirmek amacıyla kullanılan bir yapıdır Trigger.
Kelime anlamı Tetikleyici olan Trigger adına yakışır aynı güzellikde hareket etmektedir ataması yapılan tablodaki hareketleri takip ederek otomatik olarak çalışır.

Triggerler aslında Procudurelerin daha da fonksiyonelleştirilmiş halidir.
Ataması yapılan tabloda INSERT,DELETE,UPDATE olmak
üzere 3 farklı trigger kullanılabilir. SELECT işleminde kayıtlarda değişiklik olmadıgı için çalışmaz. Ayrıca Create, Alter, Drop işlemlerinde de çalışmaz.Bunların dışında View,Temp_table ler de de Trigger kullanılamaz.
Önemli husus daha var Triggerlere dışardan Parametre yollanamaz.


Tabloların maruz kaldıkları işlemlere göre trigerler geçici tablolar oluştururlar bunlar DELETE işlemi için DELETED, INSERT işlemi için INSERTED dir. Bunlar çalışma anında oluşturulur ve işlem biter bitmez silinir. Daha sonra oluşmanız münkün değildir. Burda UPDATE değinilmedigini biliyorum UPDATED diye bi tablomuz yok. Updateleri yakalamak için hem DELETED hemde INSERTED tablosundan faydalanacagız onun için ayrıca ögner yazacagım.

Aşagıda ki Trigerimizde STOK ve STOK2 adında 2 tablomuz var. Şuan için pek mantıklı bir işlemiş gibi görünsede STOK tablosundan sildigimiz kayıtları bir yerde saklama geregi duyabiliriz ve örnekler çogaltılabilir. İşde Trigerimizde bu amaca hizmet etmekte.



ALTER TRIGGER DENEME_TRIGGER --Trigerimiz tanımladık
ON STOK --hangi tabloda çalışacak

FOR DELETE
--hangi işlem için (FOR INSERT,DELETE,UPDATE aynı anda olabilir)AS

INSERT INTO STOK2 (KODU,ADI,BIRIMREF) SELECT KODU,ADI,BIRIMREF FROM DELETED

Giriş seviyesi için sanırım bu örnek yeterli daha sonra farklı örneklerle detaya inecegiz.

Şimdilik hoşcakalın...

C# Condition Kullanımı (?:)

Merhabalar;

Blogun tarzı geregi lafı çok uzatmak istemiyorum ama
bi kaç uyarı yapmadan da geçemeyecegim.

Geliştirdigimiz kodlarda asıl amaç çalışması olsada, zaman içinde gelişen ve kalabalıklaşan kod yıgınları için önceden önlemini alıp ona göre bir mimari oluşturmak gerekiyor. Bunun için mümkün oldugu kadar OOP tarafına kaymanızı tavsiye ederim.
OOP a gitmeden önce çok farkına varmadıgımız ve işi kolaylaştıran Condition kullanımından bahsedicem.

Önce kodlarımızı bir inceleyin sonra açıklamasını yapalım



Dönen sonuç 5, den büyük oldugu için dönen sonuç false olacaktır
Hemen açıklamasını yapalım
Burda yapılan işlem şu 5, 3 den büyük ise true, değilse false sonuç dönderecektir.

Condition kullanmadan bunu yapmış olsak kodlarımız aşagıda ki gibi olacaktı.

if (5<3 sonuc=" false;">sonuc =false;


Genel kullanım şekli şöyledir:

(deger) ? dorgu ise : Değilse

deger doğru ise ? den sonra ki kısım, değilse : den sonra ki kısım çalışacaktır.

Farklı bir örnek daha verelim sanırım böylece daha net anlaşılacak

string deger=null;
string str = String.IsNullOrEmpty(deger) ? "Boş" : "Dolu";
MessageBox.Show(str);

Evet işin detaylarına gittikce ufkumuzun genişledigini ve daha az satırlarla çalıştıgımızı farketmişsinizdir.
(blogspot un yapısı yüzünden if else bloklarını vs. veremedim herşeye html hatası veriyor buna ragmen)

Umarım keyfli olmuşdur.


C# Klasör İçini Temizleme

Merhablar zaman zaman klasörlerimizin içini temizleme ya da bazı dosyaları silme geregi duya biliriz.
İşde size çözüm yolu

İşe başlamadan önce

using System.IO; eklemeniz gerektigini biliyorsunuz.

FileInfo fileInfo;
string uzanti = ".txt";

foreach (string dosya in Directory.GetFiles(@"C:\TEST"))
{
fileInfo = new FileInfo(dosya);
if (fileInfo.Extension == uzanti)
// Dosya Uzantısı ve sizin uzantınız aynımı ??
{
fileInfo.Delete();
}
}

Peki ya klasörün kendini silmek istersek

Directory.Delete("klasör konumu");
bu komutun 2 overload ı vardır

1. Klasör boşsa siler
Directory.Delete(@"C:\TEST");

Silmeden önce içinde bişiler varmı kontrolünü yapabilirsiniz.

2. Klasör dolumu boşmu bakmadan siler
Directory.Delete(@"C:\TEST",true);
Tabi olaylar bu kadar değil sanırım bu konuda makelemiz yok en kısa sürede telafi edelim
Şimdilik hoşcakalın...

CURSOR KULLANIMI

Merhabalar Sql başlıca kullanılan işlemlerden biride Cursor ler dir.
Cursor ler kayıt kümesi üzerinde satır satır hareket etmemizi sağlar.
Nisbeten performans gerektiren bir işlem oldugundan dikkatli kullanılmasında fayda var.

Bu cursor blogunu herhangi procedure içinde rahatca kullanabiliriz.
Yaptıgı işlem ise bi tablodan çektigi verileri diger bi taboya insert yapıyor.

"ee zaten bunu cursor kullanmadan da yapabilirim hemde daha kısa ve kolay..." diyen arkadaşlarım olabilir, biliyoruz bunun çok çok faklı yollarıda var burda asıl amaç Cursor yazımını kavramak.

declare @code varchar(11)
declare @unvani nvarchar(50)

DECLARE DENEME_CURSOR CURSOR FOR -- cursor umuzu tanımlıyoruz
SELECT CODE, DEFINITION_ FROM CL

OPEN DENEME_CURSOR
--kullanıma açtık
FETCH NEXT FROM DENEME_CURSOR INTO @code, @unvani

WHILE @@FETCH_STATUS<>-1
--kayıtlar üzerinde hareket etmeye başladıkBEGIN
insert into CLC Values(@code,@unvani)
--insert yapıyoruz...
FETCH NEXT FROM DENEME_CURSOR INTO @code, @unvani
END

CLOSE DENEME_CURSOR
-- işi biten cursor kapatılmalıDEALLOCATE DENEME_CURSOR --Bellekde haliyle yer kaplayacagı için cursor le ilgili herşeyi temizledik...
CURSOR kullanımı oldukca kolay ve keyflidir. Artık cursor mantıgını ve yazımını kavradıgımız için gerekli hallerde hemen devreye sokarak işlerimi halledebiliriz.

Bir süre daha T-SQL üzerine gidecegim. Adım adım ilerleyerek en sonlarında senaryolarla ögrendigimiz konuları pekiştirmeyi hedefliyorum.
Bir sonra ki yazmızda görüşmek üzere hoşçakalın...

richTextBox 'a Resim Ekleme

Merhabalar;

Yeteneklerine hayran kaldıgım iki companentten biri richTextBox diğeri ise DataGridView dir. DataGridView için ilerde çok detaylı yazılar yazıcam ama önce richTextBox nasıl resim eklenir onu görelim.


private bool pasteMyBitmap(string fileName)
{

// Open an bitmap from file and copy it to the clipboard.
Bitmap myBitmap = new Bitmap(fileName);

// Copy the bitmap to the clipboard.
Clipboard.SetDataObject(myBitmap);

// Get the format for the object type.
DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);

// After verifying that the data can be pasted, paste it.
if (richTextBox1.CanPaste(myFormat))
{
richTextBox1.Paste(myFormat);
return true;
}
else
{
MessageBox.Show("The data format that you attempted to paste is not supported by this control.");
return false;
}
}


Kaynak:http://http//msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.canpaste.aspx

Umarım faydalı olur.

DataTable Sınıfı

Merhaba arkadaşlar;

Bugün DataTable sınıfını ve en sık kullanılan metodlarını inceleyecegiz.

DataTable tek tablo şeklinde verileri tutmak için kullanılır. En sık kullanılan şekli database den gelen verileri tablo şeklinde tutmak üzerinde işlemler yapmak için dir. DataSet ile arasındaki fark DataTable bir tek tablo tutarken DataSet tüm database şeklinde tüm tabloları tutar.

Burda anlatacagımız metodların bir kısmı DataSet içinde geçerlidir.

Kısa bilgiden sonra metadlarımızı sırayla geçelim.
Aslına bakarsanız bu metodların her biri ayrı makale konusudur.

DataTable ye kolon ekleme: dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("UrunAdi",typeof(string)),
new DataColumn("Birimi",typeof(string)),
new DataColumn("Adet",typeof(int))
});

yada
dt.Columns.Add("UrunAdi", typeof(string));
dt.Columns.Add("Birimi", typeof(string));
dt.Columns.Add("Adet", typeof(int));

Satır ekle:
dt.Rows.Add("Elma", "Kg", 10);

dt.Select(); Datatable içinde arama bu metod için DataTable içinde arama makalemize göz atabilirsiniz.

Xml yazma :
DataTable içinde ki verilerimizi xml formatında dosya yazmak için kullandıgımız metodumuzdur. DataSet ten farklı olarak, tekrar DataTable içine okuma yapabilmek için Xml Şeması ile birlikte oluşturmak zorundayız sadece.
dt.WriteXml("C:\\Urunler.xml");
dt.WriteXmlSchema("C:\\Urunler.xsd");

Xml okuma :
dtCopy.ReadXmlSchema("C:\\sdf.xsd");
dtCopy.ReadXml("C:\\sdf.xml");

DataTable kopyalama:
dt mizi satırlarıyla beraber başka bi dt ye kopyalamamızı sağlar.
dtCopy = dt.Copy();

Kolonları Kopyalama:
Tablonun iskelet yapısını kopyalar kolon baslıkları tipleri aynen kopyalanır fakat satırlar alınmaz dtCopy = dt.Clone();

Tablo Temizlemek:
dt mizin tüm satırlarını temizler
dt.Clear();

Tablo Birleştirmek:
dt isimli tabloyu dtCopy isimli tablo içinde birleştirir.
dtCopy.Merge(dt);

Kolon Hesaplama:
dt.Compute(); Satır hesaplama Toplama ortalama alma vs. Ayrıca işlenecek

Satır Silme:
indexi verilen satırı siler
dt.Rows.RemoveAt(satirIndex);

Satırlar Arasında Dolaşmak:
foreach(DataRow row in dt.Rows)
{
işlemler
}
aynı şekilde kolonlar arasında Columns dizisini kullanarak dolaşabilirsiniz.

Datable sınıfı ile ilgili anlatabilecek çok detay konular var ama hepsini burda anlatmaya gücümüz yetemeyeceginden belli başlı metodlarını inceledik.
Umarım bişiler katmışdır size.
Umarım umut ettikleriniz gerçekleşir...


Datatable GetChanges() Metodu

Merhaba arkadaşlar;

Bugün GetChanges() metodunu ile datatable içinde ki değişiklerimizi yakalayacagız.

Kısaca anlatacak olursak;

Database den çektigimiz veriler datatable ye doldurulur ve dataGridview controlüne basılır.
Burdan bilinmesi gereken bir şey vardır.

dataGridView1.DataSource=dt; komutu ile Datatable ve dataGridView kontrolü artık bütünleşmiştir. dataGridView de yaplan bütün değişikler aynen dt de de işlenir. İşte bu hareketleri yaklamak için yapmamız gerekenler kodlar...

Yapılabilecek hareketler ve anlamları

DataRowState.Added Eklenenler kayıtlarDataRowState.Deleted Silinenler kayıtlar
DataRowState.Detached Araştırınız
DataRowState.Unchanged Enson AcceptChanges çalıştırılmasından sonra yapılan değişiklikler

Buyrun kodlara...

DataTable dt;

private void btnDegisiklikler_Click(object sender, EventArgs e)
{

dataGridView2.DataSource = dt.GetChanges(DataRowState.Modified);
//Değişikleri gösterir
dt.GetChanges() metodu parametresiz olarak kullanıldıgında dt içinde ki değişikleri değiştirilen kayıtları getirir.

private void btnDb_Click(object sender, EventArgs e)
{
dt = new DataTable();
SqlConnection conn = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");
SqlCommand mCommand = new SqlCommand("Select * From DEPO1", conn);
SqlDataAdapter adp = new SqlDataAdapter(mCommand);
adp.Fill(dt);
dataGridView1.DataSource = dt;
}