C# – Excel To DataTable

Excel dosyasında bir çalışma kitabını veya çalışma kitabının herhangi bir hücre aralığını okuyup datatable olarak
döndürmek isterseniz aşağıdaki methodu kullanabilirsiniz.

– Method 2003-2007 dosya formatlarında çalışabilmektedir.
– Çalışma Sayfası parametresi gönderilmeyebilir, bu durumda method, dosyanın ilk çalışma sayfasını okuyacaktır.
– Hücre aralığı belirtilmez ise varsayılan olarak A1:Z65536 değerini alacaktır.

    
    private DataTable ExceltoDataTable(string ExcelDosyaYolu, string CalismaSayfasi = "", string Range = "A1:Z65536")
    {
        try
        {
            string con = "";
            if (ExcelDosyaYolu.Substring(ExcelDosyaYolu.Length - 1, 1).ToUpper() == "X")
            { con = @"Provider=Microsoft.ACE.OLEDB.12.0;"
              + "Data Source=" + ExcelDosyaYolu + ";"
              + "Extended Properties='Excel 8.0;HDR=No'";
            }
            else
            { con = "Provider=Microsoft.Jet.OLEDB.4.0;"
              + "Data Source=" + ExcelDosyaYolu + ";"
              + "Extended Properties='Excel 8.0;HDR=Yes'";
            }
            OleDbConnection xlscon = new OleDbConnection(con);
            xlscon.Open();
            //
            if (CalismaSayfasi == "")             {CalismaSayfasi = xlscon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
            }
            else {CalismaSayfasi = CalismaSayfasi + "$";}
            //
            OleDbCommand xlscmd = new OleDbCommand(@"SELECT * FROM [" + CalismaSayfasi +Range+"]", xlscon);
            OleDbDataAdapter xlsda = new OleDbDataAdapter();
            xlsda.SelectCommand = xlscmd;
            DataTable xlsdt = new DataTable();
            xlsda.Fill(xlsdt);
            xlscon.Close();
            xlsda = null;
            return xlsdt;
        }
        catch         {
            return null;
        }
        finally
        { }
    }  

Direk bir gride bağlamak isterseniz;
aspxgridview için,
grid.AutoGenerateColumns = true;
grid.Columns.Clear();
grid.DataSource = ExceltoDataTable(“C:\\Book1.xls”);
grid.DataBind();

TSQL – Birleşik metinden parse

Birleşik metin içeren bir alandan belirli bir aralığı parse etmek için aşağıdaki örneği kullanabilirsiniz.

Declare @baslangic varchar(30)= 'adsoyad :'; --sağa sola boşluk koymayalım
Declare @bitis varchar(30)= '; dogumgun :';  --sağa sola boşluk koymayalım
--
Set @baslangic='%'+@baslangic+'%';
Set @bitis='%'+@bitis+'%';
Select BirlesikMetin,ltrim(rtrim(substring(BirlesikMetin,(PATINDEX(@baslangic, BirlesikMetin)+LEN(@baslangic)-2),PATINDEX(@bitis, BirlesikMetin)-(PATINDEX(@baslangic, BirlesikMetin)+LEN(@baslangic)-2))))
From Tablom
Where  PATINDEX(@bitis, BirlesikMetin)-(PATINDEX(@baslangic, BirlesikMetin)+LEN(@baslangic)-2)>0

Alan : Adsoyad : Orhan AKDOĞAN ; dogumgun : 13
Sonuç : “Orhan AKDOĞAN” sonucunu döndürecektir.

TSQL – Birleşik adı soyadı alanını, sql ile ad ve soyad olarak ayırmak

Eğer elinizde birleşik şekilde tek bir kolonda ad ve soyad
bulunuyor ve bunları ayırmak istiyorsanız,
bu işlem için aşağıdaki sorgu size yardımcı olacaktır.
(iki isimli olma durumu dikkate alınarak yazılmıştır.)

Select adsoyad --Birleşik Hali
,left(adsoyad,len(adsoyad)+1-charindex(' ',reverse(rtrim(adsoyad)))-1)  --Adı
,right(adsoyad,charindex(' ',reverse(rtrim(adsoyad)))-1)                --Soyadı
From CV
Where charindex(' ',reverse(rtrim(adsoyad)))>0 --Soyadı Boş olmayanlar (hata verip durmaması için.)

Eğer Update etmek isterseniz;

Update CV set ad=left(adsoyad,len(adsoyad)+1-charindex(' ',reverse(rtrim(adsoyad)))-1),
			  soyad=right(adsoyad,charindex(' ',reverse(rtrim(adsoyad)))-1)			
Where charindex(' ',reverse(rtrim(adsoyad)))>0

Oracle – Order by ile Türkçe Destekli Sıralama

order by nls_sort(KolonAdı,nls_sort=xturkish) şeklindeki kullanım ile sıralamada Türkçe karakter desteği sağlayabilirsiniz.

Select * From TBLCASABIT Order By NLSSORT(CARI_ISIM,'NLS_SORT=XTURKISH')

Oracle – Lock Table Bilgileri

Oracle da Lock durumdaki Tablo bilgilerini aşağıdaki sorguyla gözleyebilirsiniz.

Select * From V$LOCKED_OBJECT 
Where object_id = (select object_id from dba_objects where object_name ='TabloAdı');

C# – Sorgu değişkenlerinde tek tırnak sorunu

Sorguları  içlere değişkenler ekleyerek dinamik yapabiliyoruz,
bunlar hem güvenlik zafiyeti doğuruyor hemde özel karakterlerin sorun çıkarmasına sebep oluyor,
mesela bir firma adı içinde geçen tek tırnak database e yazılırken sorun çıkaracaktır,
çünkü tek tırnak zaten sql için rezerve edilmiş bir karakterdir.
Sorguların içinde dinamik textleri sorgu parametreleri ile atamak en doğrusu ve en güvenlisidir, 
şimdi bu doğru ve güvenli yönteme değinmeyip, hataya açık yöntemimizi biraz daha iyi hale getirelim.

 sorguları illede aralara textler ekleyerek oluşturcaz dersek sorgu metnini aşağıdaki methotlardan geçirerek
tırnak sorununu aşabiliriz.

//Tek tırnak yerine iki adet tek tırnak; tabloda yine tek tırnak olacaktır.
public string tirnakayiklayontem1(string sqltext)
        {
            sonuc = sonuc.Replace(sqltext, "'", "''")
            return sonuc;
        }
// Tek tırnak (ascii 39) yerine benzer tırnak karakteri(ascii 63)
public string tirnakayiklayontem2(string sqltext)
        {
            sonuc = sonuc.Replace(sqltext, "'", "’")
            return sonuc;
        }

Yukarıdaki her iki yöntemde de tablomuza tek tırnak istediğimiz şekilde yazılacaktır.

veya şu mantıkda birşey de yapılabilir, oracle için:
her  ”  ‘  ” karakteri için yerine aşağıdaki değerler basılmalıdır.
Tek tırnak arada bir karakter ise
|| Chr(39) ||

Tek tırnak ilk karakter ise
 Chr(39) ||

Tek tırnak son karakter ise
|| Chr(39)

Sadece tek tırnak replace etmekle güvenli hale getirilemez tabiiki,
aşağıdaki makaleyi okumanızı tavsiye ediyorum.

SQL Injection Ataklarından Nasıl Korunuruz?

.

Oracle – LISTAGG Analystic Function

LISTAGG fonksiyonu, 11gR2 ile gelen yeni bir fonksiyondur.

Kullanımı: LISTAGG(kolonadi,ayraç)

Anlatımımızı örnekle yapalım;
Şu şekilde bir tablomuz olduğunu varsayalım;

Depertman        Personel
Muhasebe           Fikret
Muhasebe           Ceyda
Satınalma            Turan
Satınalma            Emel

Her depertman satırının karşısında kişileri listelemek isteyelim,

Depertman          Personel
Muhasebe            Fikret,Ceyda
Satınalma             Turan,Emel

bu tip bir listelemeyi LISTAGG fonksiyonu kullanarak yapabiliriz.

Select Depertman, LISTAGG(Personel,',') as "Personeller" from tblSicil Group by Depertman

Daha önce kullandığımız ve aynı işi yapan WM_CONCAT ile arasındaki farklar ise şunlardır.

1-WM_CONCAT Oracle tarafından dökümante edilmemiştir, yani desteklenmez.LISTAGG ise Oracle tarafından desteklenen bir fonksiyondur.

2-WM_CONCAT, distinct kullanımına izin verir, LISTAGG ile kullanamazsınız.

select wm_concat(distinct sehir) as sehirler from Ulkeler;

3-LISTAGG ayrılmış dizelerin kendi içinde order ına izin verir, WM_CONCAT de yapılamaz.

select listagg(sehir,',') within group(order by sehirID desc) as sehirler from Ulkeler;

4-LISTAGG ayraç olarak birden fazla karakter kullanımına izin verir, WM_CONCAT buna izin vermez.

select listagg(sehir,'***') within group(order by sehirID desc) as sehirler from Ulkeler;

5-WM_CONCAT keep kullanımına izin verir, LISTAGG izin vermez.

select wm_concat(sehir) keep(dense_rank first order by sehirID ) as sehirler from Ulkeler;

6-WM_CONCAT olap da order by kullanımına izin verir, LISTAGG izin vermez.LISTAGG order by haricinde OLAP da desteklenir.

select deptno,wm_concat(sehir) over(order by sehirID ) as enames from Ulkeler;

C# – Printer Listesi

Printer Listesini Combobox’a doldurmak:

using System.Drawing.Printing;

foreach (string strPrinter in PrinterSettings.InstalledPrinters)
{
PrinterCombo.Items.Add (strPrinter);
}

SQL Server Denali ile gelen yeni System Objeleri

Bu yazıda Aaron Bertrand ın bloğunda gördüğüm, aynı zamanda iki veritabanının kıyaslanmasında da kullanabileceğimiz bir yöntemi paylaşmak istiyorum.

2008 R2 instance ‘ı ile SQL  Server Denali instance ındaki sistem objelerini, yazacağımız bir sorgu ile eşleştirip, yeni sistem objelerini, kaldırılmış ve değişikliğe uğramış system obje lerini tesbit edebiliriz.

SQL Server DENALI Yeni eklenen System Objeleri

SELECT
    [name] = N'sys.' + o.name,
    [type] = o.type_desc
FROM
    [master].sys.all_objects AS o
LEFT OUTER JOIN
    [ORHAN\2008R2].[master].sys.all_objects AS oo
ON
    o.name = oo.name
    AND o.[schema_id] = oo.[schema_id]
WHERE
    oo.name IS NULL
    AND o.[schema_id] = 4
ORDER BY
    o.type_desc,
    o.name;

  Devamını okumak için tıklayınız »

Oracle – NVL, NVL2, NULLIF, COALESCE

NVL (expr1, expr2)

NULL bir değeri  gerçek bir değere dönüştürmek için kullanırız. Çevrim değil yerine geçme söz konusudur.

SELECT AD,SOYAD,NVL(BAKIYE,0)  
FROM VWOGRENCI

Hiç hareket görmemiş yani alacak ve borç kaydı yapılmamış bir öğrencinin bakiyesi null dönecektir, bu sorgu ile null değerlerin 0 olarak dönmesini sağlıyoruz.

Yeni başlayanlar tarafından en çok yapılan yanlışlardan biride, NULL ile boş ya da sıfır değeri eşdeğer görmektir.

NULL; alana herhangi bir değer atanmadığını ifade eder.Boş (“”) veya Sıfır (0) atamaları ise karakter ve nümerik değerlerdir.

SELECT STOK_KODU "Stok Kodu"  ,MAX_ISKONTO "Maximum İskonto"
FROM TBLSTSABIT
WHERE MAX_ISKONTO = NULL

Bu kullanım hatalıdır çünkü NULL bir değer yoktur bu yüzden atama kontrolü de olamaz.

Eğer Maximum İskonto değeri belirlenmemiş kayıtları listelemek amaç ise, doğrusu şu şekilde olmalıdır:

SELECT STOK_KODU "Stok Kodu"  ,MAX_ISKONTO "Maximum İskonto"
FROM TBLSTSABIT
WHERE MAX_ISKONTO IS NULL

NVL2 (expr1, expr2, expr3)

Fonksiyonda expr1 NULL değilse expr2, expr1 NULL ise  expr3 ‘ü değer olarak döndürür.

SELECT  NVL2(ikinciad  , ad+' '+ikinciad+' '+soyad  ,  ad+' '+soyad) "AD SOYAD"
FROM VWOGRENCI

NULLIF (expr1, expr2)
Bu fonksiyon ile iki değer karşılaştırılır, eğer expr1 ile expr2 eşitse NULL, eşit değiller ise expr1 sonuç olarak dönülür.

expr1 ve expr2 sayısal değerler ya da aynı veritipinin değerleri olmalıdır.

NULLIF deyimi Oracle 9i, Oracle 10g, Oracle 11g versiyonlarında desteklenmektedir.

NULLIF(12, 12)     -- "NULL"
NULLIF(12, 13)     -- "12"
NULLIF('orhan', 'orhan')    --"NULL"
NULLIF('orhan', 'ibrahim')  --"orhan"
NULLIF(NULL, 12)   -- "ORA-00932 error because expr1 can not be the literal NULL" hatası.

COALESCE (expr1, expr2, . . , exprn)

Coalesce fonksiyonu aldığı argümanlardan null olmayan ilk ifadeyi görüntüler.

SELECT coalesce (ceptel, istel, evtel,'Girilmemiş') "Telefon"
FROM Ogrenci;

Bu Sorgu girilmiş olan ilk telefon bilgisini sonuç olarak döndürür;
bu işlemi alternatif bir yolla yapmak isteseydik;

IF ceptel is not null THEN
     result := ceptel;
ELSIF istel is not null THEN
    result := istel;
ELSIF evtel is not null THEN
    result := evtel;
ELSIF 'Girilmemiş' is not null THEN
    result := 'Girilmemiş';
ELSE
    result := null;
END IF;

şeklinde kullanmamız gerekirdi.

Coalesce deyimi Oracle 9i, Oracle 10g, Oracle 11g versiyonlarında desteklenmektedir.

Microsoft SQL Server’da;
NVL karşılığı ISNULL,
NULLIF ve COALESCE (‘koliş’) ise aynen kulanılır.
NVL2‘nin ise karşılığı yok.