23 Ocak 2010 Cumartesi

C# ve Enumeration (Enum) Kullanımı

Bu makalemde C# sunduğu iki değer türünden biri olan enumeration’ı size anlatacağım. Program yazarken bir çok değişken tanımlar ve bu değişkenlere  sayısal değer  vererek işlemimize başlarız. Ama bu yöntem çokta fazla sezgisel değildir.
Örneğin programımızda haftanın günlerini sunmak istediğimizi düşünelim. Birde günlerle karmaşık işlemler yapacağımız düşünelim. Bunun için  hergüne sayısal değer vermemiz yeterli olacaktır. Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, ve Pazar’a    0,1,2,3,4,5 ve 6 tam sayı değerlerini tanımlamamız yeterli olacak ve bu tamsayılar üzerinden işlemlerimiz gerçekleşecektir. Ama sıfırı (0) kullandıktan ve bir süre sonra kodumuza bakarken sıfırın Pazartesi’ni ifade ettiğini anlamak zor olacaktır. Bu durumda C# güzel bir çözüm sunar ve değerlerin grup sembolik bir adla bildirebileceğimiz enum anahtar sözcüğünü kullanırız.
Bir Enumeration türü bildirmek
Enum DaysOfTheWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
 }
Enumeration’a  erişmek
Yukarıda haftanın günlerini tanımlayan bir enumeration tanımladık. Burdan sadece Cumartesi gününün değerini almak istersek,
DaysOfTheWeek day = DaysOfTheWeek.Saturday;
MessageBox.Show(day.ToString());
Mesaj kutumuzda “6” yazacaktır.
Bu noktada size tüm değer türleri gibi, ? düzenleyici kullanarak enumlandırma değişkeni boş değer alabileceğini hatırlatmak isterim. Daha sonra enumda tanımlanmış bir değer atayabilir veya null değerde set edilebilir.
Haftanın günlerinin hepsini birden almak istersek .GetNames() metodunu kullanırız. Bu metod yardımıyla enum içerisinde kullandığımız değerleri  string formatında bir dizide kullanabiliriz.
Örneğin  string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));  bu kod yardımıyla  artık  days string dizisinde enumdaki elemanlarımız var.
İsterseniz bir tamsayı sabitini bir enum sabitiyle ilişkilendirebilirsiniz.

Örneğin;
enum DaysOfTheWeek
{
Monday,
Tuesday  =  1,
Wednesday = 3,
Thursday,
Friday,
Saturday,
Sunday
 }

Birden çok numaralandırma kalıbına aynı değerde verilebilir.  Örneğin İngiltere’de  Sonbahar için fall yerine Autumn kullanılır. Bunu tanımlayan bir enum kalıbı tanımlıyacak olursak şu şekilde olur.

Enum Season
{
Spring,
Summer,
Fall = Autumn,
Winter
}

string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
Tekrar başa dönerek DaysOfTheWeek’te tanımladığımız haftanın günlerini combobox ile kullanıya seçtirmek istiyoruz. Bunun içinde haftanın günlerini combobox’ın içine atmamız gerekmekte bunun için şu kodu yazmamız yeterli olacaktır.

// İlk önce Get.Names(); metodunu kullanarak string bir dizinin içerine günleri atıyorum
string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
// Daha sonra bu dizinin içerisinde dönerek her bir string değeri combobox ın içerisine atıyorum.
       foreach(string day in days)
       {
            daysCombo.Item.Add(day);
       } 
Artık daysCombo adındaki combobox’ta sırasıyla DayOfTheWeek’teki sabitlerimiz eklenmiş durumda.

Birde şunu anlatmanın yararlı olacağını düşünüyorum. DaysOfTheWeek  sabitlerinin içerisinde bir kontrol  yaparak istediğimiz sabitin enum altında tanımlı olan bir sabit olup, olmadığını görmek için IsDefined(); metodunu kullanmamız yeterli olacaktır. Bu metod bool bir sonuç gönderir. Dikkat etmemiz gereken şey ise case sensitive çalışmasıdır.

Örneğin ;
bool success = Enum.IsDefined(typeof(DaysOfTheWeek), “Thursday”);
İf(success)
{
       MessageBox.Show(“Found”);
}
else
{
       MessageBox.Show(“Not Found”);
}


Bu örnek bize Perşembe gününün haftanın günleri enumunda tanımlı olup olmadığını göstericek eğer tanımlı ise IsDefined metodundan tru dönecek ve mesaj kutumuzda bulundu yazacak, yoksa false değer döndürecek ve bulunamadı mesajı ile karşılaşacağız.

Eğer isDefined metodunda şunu yazmış olsaydık,

Enum.IsDefined(typeof(DaysOfTheWeek), “THURSDAY”);
Bu bize false dönecekti. Dikkat etmenizde yarar var.

enum sabitleriyle ToString() metodunun kullanılması.
Burada hemen parametre değerlerini ve işlevlerini açıklamak ve nasıl kullanıcalağını göstermenin yeterli olacağını düşünüyorum.
Parametre Değeri
İşlevi
G
Enum sabiti içerisindeki ilgili değeri genel(General) formatta yazar.
D
Enum sabiti içerisindeki ilgili değerin sayısal(Decimal) karşılığını yazar.
X
Enum sabiti içerisindeki ilgili değerin Hexadecimal (16lı sayı sistemindeki) karşılığını yazar.
 F
FlagsAttribute’ unun kullanılıp kullanılmamasına göre ilgili enum sabiti değerinin string karşılığını yazar.



23 Aralık 2009 Çarşamba

DevExpress ile xtraGrid'te seçili Row değerini array olarak alma.



object[] selectedRow = ((System.Data.DataRowView)
((DevExpress.XtraGrid.Views.Grid.GridView)xtraGridDetailView.MainView).GetFocusedRow()).Row.ItemArray as object[];

Bu kod parçasıyla devEx xtraGrid de seçilen satırı selectedRow object arrayine atıyoruz.

Sql Server da Bulk Insert nedir?

Kısacası metin dosyalarının SQL Server'a aktarmanın en kolay yoludur. Bunu yapmanız için bilmeniz gereken ufak tefek ayrıntıdan başka bir şey yok.

Sıralamak gerekirse,

-Metin dosyasının uzantısını
-Kolonlar birbirinden hangi karakterle ayrılıyor
-Satır sonları nasıl belirlenmiş bilmemiz yeterli.

Bulk Insert komutu ise

BULK INSERT TableName FROM  'Path(DosyaYolu)' WITH (FIELDTEMINATOR = ',')


FIELDTERMINATOR - ile metin dosyamızda bulunan kayıtların kolonlara ayrılmak istenildiğinde hangi karakterle ayırma işlemi yapılacak olduğunu belirtliğimiz yerdir.

Ufak bir örnek yaparak deneme yapacak olursak bunun için hemen bir tablo oluşturalım.

CREATE TABLE User
(
id int,
Name nvarchar(50),
LastName  nvarchar(50),
Age int,
City nvarchar(50),
)

Sql tablomuzuda oluşturduk ya metin dosyamız??? Onuda basit bir şekilde yazıyorum hemen.
Mesela buda C klasörünün altında Users.txt metin dosyamız olsun.

1$Ali$Alioğlu$18$Istanbul
2$Veli$Velioğlu$19$Bursa
3$Ahmet$Ahmetoğlu$20$malatya
4$Mehmet$Mehmetoğlu$21$Edirne


BULK INSERT User FROM  'C:\Users.txt' WITH (FIELDTEMINATOR = '$')


--Dolar ($) kullandım. Çünkü text içerisinde kullanılabilecek karakterden uzak durdum. İşimi garantiye aldım.


Bu şekilde hdd mizde bulunan bir txt dosyasını SQL de oluşturduğumuz bir tabloya taşımız bulunuyoruz.
Ama burada önemli nokta taşıma esnasında türkçe karakter sorunu yaşıyor olacağımızdır. Bunun çözümüde çok basit Bulk Insert komutumuza CODEPAGE = '1254' eklememiz yeterli olucak.

Şu şekilde kullanıcaz yani
BULK INSERT User FROM  'C:\Users.txt' WITH (FIELDTEMINATOR = '$' , CODEPAGE = '1254' )


Bu işlemleri sırasıyla yaptık ama birden karşımıza

You do not have permission to use the bulk load statement.


Bu durum Bulk Insert yetkinizin olmasından kaynaklanıyor. sysadmin veya bulkadmin rollerinize sahip olursanız bu hatayıda basitçe geçiceksiniz.






22 Aralık 2009 Salı

Sql Server da Case - When yapısı

Sql cümlelerimizde belirli durumlar (koşullar) karşısında farklı işlemler yapmak istiyorsak Case - When yapısını kullanabiliriz.
Yapı Oldukça basit

Kullanım:

CASE
WHEN Koşul_1 THEN Koşul_1 gerçekleştiğinde yapılacaklar
WHEN Koşul_2 THEN Koşul_2  gerçekleştiğinde yapılacaklar
WHEN Koşul_3 THEN Koşul_3  gerçekleştiğinde yapılacaklar
ELSE (bu belirtilen 3 durumun gerçekleşmemesi durumunda yapılacaklar)
END

Örnek:


SELECT Name, LastName
CASE Gender
WHEN 'F' THEN 'Female'
WHEN 'M' THEN 'Male'
END AS Gender FROM Users


21 Aralık 2009 Pazartesi

ContextSwitchDeadlock was detected durumu

Hata: 
" CLR, 60 saniye içinde 0x46fae0 COM içeriğinden 0x46fc50 COM içeriğine geçemedi. Hedef içeriğe/gruba sahip olan iş parçacığı büyük olasılıkla pompalamayan bekleme yapıyor veya Windows iletileri pompalamadan çok uzun süreyle çalışan bir işlemi işliyor. Bu durum performansı genellikle kötü etkiler ve uygulamanın yanıt vermemesine veya bellek kullanımının zaman içinde sürekli artmasına neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı (STA) grup iş parçacıklarının bekleme komutları (örn. CoWaitForMultipleHandles) pompalaması ve uzun süre çalışan işlemler sırasında da düzenli olarak ileti pompalaması gerekir. "

Çözüm:
Debug >> Exceptions >> Managed Debug Assistants burada bulunan ContextSwitchDeadlock check'i kaldırın. Bu hatayı ayrıca  Release aşamasında almıyorsunuz bunuda belirtmek isterim.