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.

11 Aralık 2009 Cuma

SQL Server ile Stored Procedure

Stored Procedure Nedir?

Stored Procedure aslına bakıcak olursak kendi database server'da saklanan SQL ifadeleri olarak düşünebilir. Bir programlama dilinde fonksiyonların parametre alması gibi, stored procedureler de parametre alabilir. Bu parametrelerle bir sorgu çalıştırıp cevap geri gönderebilirler.

Stored Procedure'un diğer bir özelleği ise programlama deyimleri içermesidir. Yani İf, next ve benzeri ifaderi stored procedurelerde kullanıp, mantıksal denetimleri gerçekleştirip, geriye sonuçları dönebilirsiniz. Biraz önce açıkladığım gibi stored procedure parametre aldığı için girilen değerlere göre sonuçta dönebilirsiniz.

Stored procedureler database serverda saklanmasından dolayı daha hızlı çalışırlar. Bunun nedeni bir stored procedure ilk çalışma anında derlenir ve sonraki çalışma anlarında bir daha derlenmez.

Yani bir program içerisinden SQL ifademizle servere bağlanıp ifadenin sonucunu programımıza çekerken database bir daha derlenir. Aynı işlemi bir daha yaptığımızda SQL server da database bir daha derlenir. Tabii ki bu zaman kaybına neden olur.

Bazı programcılar SQL ifadesi yazmak yerine devamlı stored procedure yazar, bazılarıda hiç kullanmaz. Ben hiç kullanmayanlardanım. =)


SQL Serverda Stored Procedure Oluşturmak

SQL serverda veritabanı oluşturduğumuz zaman stored procedure oluşturmak için Stored Procedures klasöründen oluşturabiliriz. Klasöre sağ tıklayarak yeni bir stored procedure oluştur demeniz yeterli olcak...

CREATE PROCEDURE CustOrderHist @CustomerID nchar(5)

AS

SELECT ProductName, Total=SUM(Quantity)FROM Products P, [Order Details] OD, Orders O, Customers CWHERE C.CustomerID = @CustomerIDAND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID

GROUP BY ProductName

Örneğimizde Create Procedure diyerek bir procedure oluş komutu vermiş oluyoruz. Daha sonra procedure ismimizi veriyoruz. Kullanacağımız parametrik ifadeyi AS ve Create Procedure ifadelerinin arasına yazıyoruz. Dikkat edersek parametrik ifadenin veri tipini isminden sonra yazıyoruz. AS kelimesinden sonra gerekli olan sql ifademinizi giriyoruz ve işlem tamamlanıyor.

Peki bu kadar mı?

Tabii ki hayır. Procedure derlenmedi. Şuan sadece havaya yazı yazmış gibi bir şey yapmış oluyoruz.

exec CustOrderHist yazarak procedure derlenmiş oluyor.

Şimdi stored procedures klasörümüzü yenilersek CustOrderHist adında nur topu gibi bir sp miz oldu. Üzerinde bir değişiklik yapmamız için çift tıklayıp açın değişikliğinizi yapın ve tekrar exec ile derleyin bu kadar... Kolay gelsin.