24 Mayıs 2010 Pazartesi

T-SQL İle Tarihler Üzerinde İşlemler Yapmak

SELECT CURRENT_TIMESTAMP
-- Sonuç : 2009-07-20 10:39:15.097


SELECT DATEADD(day,2,'2009-07-20')
-- Sonuç : 2009-07-22 00:00:00.000

SELECT DATEADD(month,2,'2009-07-20')
-- Sonuç : 2009-09-20 00:00:00.000


SELECT DATEDIFF(day,'2009-07-20','2015-02-09')
-- Sonuç : 2030 (Gün olarak aldık)

SELECT DATENAME(month, '2009-07-20')
-- Sonuç : July


SELECT DATENAME(weekday, '2009-07-20')
-- Sonuç : Monday

SELECT DATEPART(month, '2009-07-20')
-- Sonuç : 7


--Şuanki Zaman ve Tarihi verir
SELECT GETDATE()
-- Sonuç : 2009-07-20 11:52:32.893

-- Londra - Greenwich Saati
SELECT GETUTCDATE()
-- Sonuç : 2009-07-20 08:52:44.693


--Girilen string değerin tarih olup olmadığını belirler. 1 ise tarih 0 ise değil.
SELECT ISDATE('2009-07-20') -- Sonuç : 1
SELECT ISDATE('2014-18-09') -- Sonuç : 0

--girilen Tarihin gün bilgisini verir.
SELECT DAY('2009-07-20')
-- Sonuç : 20


--girilen Tarihin ay bilgisini verir.
SELECT MONTH('2009-07-20')
-- Sonuç : 7

--Girilen Tarihin yıl bilgisini verir.
SELECT YEAR('2009-07-20')
-- Sonuç : 2009


--Sistem Zamanını verir.
SELECT SYSDATETIME()
-- Sonuç : 2009-07-20 11:53:15.7138432

--Sistem Zamanını Greenwiche göre verir.
SELECT SYSUTCDATETIME()
-- Sonuç : 2009-07-20 08:53:25.9958432


-- DATEADD: Şuanki, Tarihe 7 Gün ekleyelim.
-- Bunun için 1 hafta eklemek veya 7 gün eklemek yeterlidir.
SELECT DATEADD(DD, 7, GETDATE())

SELECT DATEADD(WW, 1, GETDATE())

-- Şuanki Tarihe göre Ayın hangi günündeyiz.
SELECT DAY(GETDATE())


-- Şuanki Ayın Ilk günü
SELECT DATEADD(DD,-(DAY(GETDATE())-1),CONVERT(VARCHAR,GETDATE(),112))

-- Şuanki Ayın son günü
SELECT DATEADD(DD,-(DAY(DATEADD(MM,1,GETDATE()))),DATEADD(MM,1, CONVERT(VARCHAR,GETDATE(),112)))


-- DATEDIFF: Ocak 1 2007 den bugune kadar kaç gün geçti
SELECT DATEDIFF(DD,'20070101',GETDATE())

-- DATENAME: Şuanki Ay
SELECT DATENAME(MM, GETDATE())


-- Hangi Aydayız.
SELECT MONTH(GETDATE())

-- Hangi Yıldayız
SELECT YEAR(CURRENT_TIMESTAMP)


--C#'taki gibi Tarih Stilleri
1- 101 (mm/dd/yy)
2- 102 (yy.mm.dd)
3- 103 (dd/mm/yy)
4- 104 (dd.mm.yy)
5- 105 (dd-mm-yy)
6- 106 (dd mon yy)
7- 107 (Mon dd , yy)
8- 108 (hh:mm:ss)
9- 109 (Mon dd yyyy Hh:mi:ss:mmm AM yada PM)
10 – 110 (mm-dd-yy)
11 – 111 (Yy/mm/dd)
12- 112 (Yymmdd)
13- 11 3 (Dd mm yyy hh:mm:ss:mmm)
14- 114 (Hh:mi:ss:mmm)
20- 120 (Yyyy-mm:dd hh:mm:ss)
21- 121 (Yyy-mm:dd hh:mi:ss:mmm)

Microsoft'un sitesinden de farklı stillere bakabilirsiniz.

SELECT CONVERT(CHAR(20), GETDATE(),103) as "şu andaki zaman" 07.07.2010
SELECT CONVERT(CHAR(20), GETDATE(),108) as "şu andaki saat" 14:51:25

Zamanla buraya daha farklı zaman fonksiyonlarıda ekliyecem.

13 Mayıs 2010 Perşembe

Asp.net Dinamik event handler ve Dinamik Kontroller

Merhaba arkadaşlar. kısa olmasına karşın çok pratik bir kod paylaşacağım.
Bu kodda asp.net kontrollerini dinamik oluşturacağız. ama sırf bunu anlatmak için açmadım konuyu. birde

ajax ile de kullanabileceğiniz kullanabileceğiniz dinamik event handler atama işlemine değineceğim.

Sayfamıza bir placeholder ekleyelim ve pageload'a gelelim

for(int i=1;i<10;i++)
{
Button tus = new Button();
tus.Click += new System.EventHandler(this.tikla);
tus.ID = "tus" + i.ToString();
tus.Text = "Tus " + i.ToString();
PlaceHolder1.Controls.Add(tus);


Literal lt = new Literal();
lt.Text = "
";
lt.ID = "lit" + i.ToString();
PlaceHolder1.Controls.Add(lt);
}

kodumuz yukarıda biraz açıklayacak olursak. for döngümüz içinde buton sınıfından bir nesne

oluşturuyoruz. bu nesnenin click özelliğine kendi yazdığımız tıkla fonksiyonunu atıyoruz. id'sini ve

text'ini fordaki i değişkenimizle, sıralı oalcak şekilde atıyoruz (tus1,tus2..) evet butonumuz oluştu.

şimdi bunu sayfamızda görebilmek için placeholder nesnemize atalım.

2. bölümde aynı işlemleri literal için yapıyoruz. alt satıra atmak için literal textine
br atıyoruz.hiç dinamik kontrol kullanmayanlara örnek olması için. bir de literal oluşturdum.

Şimdi fonksiyonumuza geçelim. bu fonksiyon yukarıda butonlara atadığımız kendi yazacağımız fonksiyon.

static butonlarda butona çift tıklayınca çıkan onclick fonksiyonundan pek farklı değil.


protected void tikla(object sender, EventArgs e)
{


System.Web.UI.WebControls.Button dugme = sender as System.Web.UI.WebControls.Button;


if (dugme != null)
{
Response.Write(dugme.Text+" basıldı");


//buton numarasını alabiliriz. veri tabanındaki id'yi atadıysak querystring yerine

kullanabiliriz.
int id = Convert.ToInt32(dugme.ID.Replace("tus",""));

}


}

kısaca açıklayacak olursak.normal click fonksiyonundan farklı olarak biz bu fonksiyonu for döngüsü

içinde 10 tane butona atatık. ve hangi butona tıklandığına ilişkin bir kod yazacağız fonksiyona.

sender objnesnesizim butonumuzu temsil ediyor bu zaten static fonksiyonlarda da var. ama bunu yine

System.Web.UI.WebControls sınıfından butona çevirmeden direkt kullanamıyoruz.(fonksiyon içindeki ilk kod

bunu yapıyor) dugme nesnesine atadık.

2. kodda null olmadığından emin olalım her ihtimale karşı önlemimizi alalım. evet artık hangi butona

tıklandığını bulmuş olduk. bu butonun text'ini yazdıyoruz. buton id'sindeki tus kelimesini replace

ederek de numarasını buluyoruz.

bu numara bulma işlemi eğer for değilde bir db'den çekilen kayıtla oluşturulmuş nesnelerde (veri

tabanındaki kayıt id'si atanmışsa) direkt bize id'yi verir. evet kısa da olsa ajaxla uğraştığım

zamanlarda geliştirdiğim bana çok kolaylık sağlamış bir koddur.

Ajaxla uğraşanlar bilirler request işlemlerini kullanmak istediğimizde başımız belaya girer :) her

sayfaya query string de gönderemeyiz. çünkü yenilenmemesi gerekir.yada link olması gerekir.

işte bu gibi durumlarda bu kod kurtarıcınız olacakatır.
id göndermeden işlem yapmak isterseniz. yine server ve asp.net tabanlı güzel bir çözümdür.

aynı zamanda birden çok butonu tek fonksiyondan kontrol etmek isterseniz yine buradan

faydalanabilirsiniz.

Kaynak: http://www.kodaman.org/yazi/asp-net-dinamik-event-handler

12 Mayıs 2010 Çarşamba

ADO.NET tarafında SQL function nesnesi kullanmak

Selam dostlar.

Biliyorsunuz, Microsoft SQL Server tarafında kullandığımız function isimli nesnelerimiz var. Bu nesnelerin kullanım amacı nedir ve ADO.NET tarafından nasıl çağrılır? Biraz bu konulara değinelim.

Arkadaşlar, ilk başta şu sorunu bir çözelim stored procedure ile function arasında nasıl bir fark var? Veritabanındaki her işi stored procedure ile yapmak mümkün mü? Bu konuyu biraz masaya yatıralım (Bazı SQL'ciler, her şeyi stored procedure'ler ile yapabileceklerini iddia ederler).

Function ile Stored Procedure arasındaki en büyük fark şudur; bir stored procedure içindeki işlem, geriye ya herhangi bir tablodan bağımsız bir değer döndürür ya da belirli bir tabloya (ya da tablolara) bağlı bir result set (sonuç grubu J) oluştururlar. Oysa bir function nesnesi (Table döndürenleri hariç) , herhangi bir sorgu ifadesi içinde kullanılabilir. Böylece döndürdüğü değeri elde etmek için kullandığı parametreyi kendiniz atayabileceğiniz gibi, herhangi bir tablonun herhangi bir kolonunu da verebilirsiniz…

Örneğin, verilen parametrenin KDV eklenmiş halini hesaplamak amacıyla şöyle bir fonksiyon oluşturalım:

CREATE FUNCTION KDVHesapla

(@Fiyat money)

RETURNS money

AS

BEGIN

DECLARE @donenDeger money

SET @donenDeger = @Fiyat * 1.18

RETURN @donenDeger

END

Bakın bu fonksiyonu şu şekilde kullanabilirsiniz:

SELECT dbo.KDVHesapla(30)

Bir de aşağıdaki gibi kullanabilirsiniz:

SELECT ProductName,dbo.KDVHesapla(UnitPrice) FROM Products

Gördüğünüz gibi, function nesnemi her türlü sorgu ile kullanabilirim. Haydi yapabilirseniz aynı şeyi Stored Procedure ile yapın J

Burada, function'dan ve kullanımından bahsetmişken, aslında ADO.NET tarafından nasıl çağrılması gerektiğini de anlatmış olduk. Function nesnesi, zaten sorgu ile birlikte kullanıldığı için ADO.NET tarafında ekstra bir işleme gerek duymazsınız.

Yani:

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");

SqlDataAdapter da = new SqlDataAdapter("Select ProductName, dbo.KdvHesapla(UnitPrice) from Products", con);

DataTable dt = new DataTable();

da.Fill(dt);

dataGridView1.DataSource = dt;

Haliyle, normal bir sorgu çekmekten hiçbir farkı yok.

Kendinize iyi bakın.

İyi çalışmalar.

Kaynak: http://www.turkayurkmez.com/post/2008/09/13/ADONET-tarafinda-SQL-function-nesnesi-kullanmak.aspx

FileUpload ve Güvenlik

ASP.NET uygulamarınızda kullanıcılardan dosya transferi yapmak istediğimizde FileUpload Asp.net sunucu kontrolü ile basit bir şekilde bu işlemi hallederiz.Basit bir örnek ile

if (FileUpload1.HasFile)
{
try
{
FileUpload1.SaveAs(Server.MapPath(".") + "/uploads/" + FileUpload1.FileName);
}
catch (Exception exp)
{
//hede höde
}
}

Tabi dosyaları saklayacağınız dizine yazma hakkı (ASP.NET kullanıcısına) vermeliyiz. Buraya kadar herşey doğal gibi görünse de unuttuğumuz küçük! bir ayrıntı var ki o da dosya boyutu ve dosya tipi. Öncelikle istemediğimiz dosya tiplerinin sunucumuza upload edilmesini önlemeliyiz. Kullanıcıdan sunucuya gönderilen dosya tipini

Response.Write(FileUpload1.PostedFile.ContentType);
//bir txt dosyasını gönderdiğinizde tarayıcımızda "text/plain",bir mp3 dosyası göndediğimizde ise "audio/mpeg" yazdıgını göreceğiz.

kod satırı ile öğrenebilir ve istemediğimiz tipdeki dosyaların sunucuya gönderilmesini engelleyebiriz.Peki gelelim dosya büyüklüğüne. Bu basit hali ile uygulamamızı kullanıcılara açtığımızda beklenmedik bir durum ile karşılaşma ihtimalimiz çok yüksek. Örneğin iş başvurusu yapılacak ve kullanıcılardan CV lerini word dökümanı olarak istemekteyiz. ContentType ile dosya tipini belirleyerek başka formatlardaki dosyaları sunucumuza gönderilmesini engelledik. E güzel!. Dosya boyu 5 mb olan bir kullanıcı CV sini göndermeye çalıştığında ne olur ? Görünürde "ne olabilir ki?" dediğimizde aslında sunucumuz - iis - bu işlemi iptal edecek ve hatta yukardaki kod örneğinde catch bloğumuz işe yaramayacaktır. Olan olmuştur. Sunucu bir request'deki varsayılan büyüklük olan 4MB sınırının aşıldığını tespit edecek ve bir hata oluşturacaktır (HttpUnhandledException). Peki Global.asax da biz bu hatayı yaklayıp inceleyelim.



Görüldüğü gibi yakalanan hatamızın InnerException nesnesine baktığımızda oluşturulan isteğin sınırı aştığını görebiliriz. Bu bizim için aslında dezavantajdan ziyada avantajdır.Çok büyük dosyalar yükleyerek sistemimizin yavaş çalışmasına neden olacak kötü niyetli arkaşlarımızı! birazcık üzecektir. Çözüm ise sunucumuzun gelen isteklerin boyutunun 4MB den büyük olmasına izin vermesi. Bunu da web.config doyasını aşağıdaki gibi düzenleyerek sağlayabiliriz.



Artık sunucumuz bu ayar ile maksimum istek boyutunu yaklaşık 16MB olarak kabul edecektir. Tabi burda dikkat etmemiz gereken en önemli nokta ise sunucumuzun bu uzun işlemler sırasında -16MB lik bir dosya kullanıcının bağlantısı yavaş olduğunu göz önüne alındığında yüklenmesi uzun bir işlem olacaktır - Normalde 90 sn boyunca gelen isteğe cevap veremezse IIS, isteği sonlandıracak ve timeout hatası gönderecektir. Bunu da engellemek için web.config dosyamızda aşağıdaki düzenlemeyi yaparız.



artık sunucumuz 90 sn değil 360 sn boyunca gelen isteği cevaplamak için "var gücü ile :) " çaba sarfedecektir ;) Tabi bu süreyi iyi analiz etmeli performans sorunları yaşamamak için bu sürenin uygulamanız çerçevesinde ne kadar süre olarak belirlenmesini iyi analiz etmek gerekir.

Kaynak: http://www.oguzyagmur.com/PermaLink,guid,a0237b88-624f-47ae-b26e-4edbbf324750.aspx

10 Mayıs 2010 Pazartesi

HashSet Kullanımı

HashSet h = new HashSet();
h.Add(7);
h.Add(11);
h.Add(7);

Console.WriteLine(h.Count);

IIS Yüklerken Dosya Kopyalayamama Hatası


Windows XP Professional SP2-SP3 çalışan bir bilgisayara IIS yüklemeye çalıştığınızda "Kur staxmem.dll dosyasını kopyalayamadı" hata iletisini alabilirsiniz
Hatayı düzeltmek ve kurulumu yapmak için aşağıdaki adımları izleyiniz:

1. Başlat'ı tıklatın, Çalıştır'ı tıklatın, cmd yazın ve Tamam'ı tıklatın.
2. Komut istemine aşağıdaki komutu yazın ve ENTER tuşuna basın:
esentutl /g c:\Windows\security\database\secedit.sdb
3. Komut istemine aşağıdaki komutu yazın ve ENTER tuşuna basın:
esentutl /p Sürücü:\Windows\security\database\secedit.sdb
4. "Database log dosyalarında değişiklik yapıcam veri kaybına uğrayabilirsiniz" hata iletisine Tamam Diyoruz.
5. IIS kuruluma devam edin.

9 Mayıs 2010 Pazar

Sansüre Karşı DNS Ayarı


Daha önceden Sansürü Kaldıran Tarayıcı Opera makalesinde söz verdiğim bir konuyu anlatacam. Daha doğrusu resimle gösterecem :).