Sayfalar

22 Aralık 2008 Pazartesi

SQL Server CharIndex

String bir veri içerisinde belirtilen bir karakterin aranması için kullanılır. CharIndex() fonksiyonu string içerisin aranan karakteri bulduğu index sayısını döndürür. Yani CharIndex() fonksiyonu bize aranan karakterin string ifade içerisinde kaç defa geçtiği bilgisini vermez.

Kullanımı; charindex('','')

select charindex('-','216-1234567') -- 4 sonucunu verir
select charindex('-','216-123-45-67') -- 4 sonucunu verir

Not: İki örnekte de charindex fonksiyonu 4 sonucunu döndürdü. '-' karakterinin ilk geçtiği yer 4. karakter olduğu için 4 sayısı elde edilir. Bundan da anlaşıldığı gibi charindex() ile aradığımız karakterin ilk geçtiği index değeri elde edilebilir. 2. kez geçtiği indexi vermez.

SQL Format Number

DECLARE @Number AS MONEY
SET @Number = 756846.6985

SELECT CONVERT(VARCHAR,@Number,0) -- Sayıyı formatsız Round eder (756846.70)

SELECT CONVERT(VARCHAR,@Number,1) -- Sayıyı, virgülle formatlar ve Round eder (756,846.70)

SELECT CONVERT(VARCHAR,@Number,2) --Herhangi bir format uygulamaz (756846.6985)

Not : Bir sayıyı formatlarken formatlanan sayının money tipinde olması gerekmektedir. Bu nedenle decimal yada float tipinde tanımlanan değişkenler money tipine dönüştürülerek formatlama işlemi yapılmalıdır

Örnek 1:
DECLARE @nNumber AS DECIMAL(15,4)
SET @nNumber = 756846.6985
SELECT CONVERT(VARCHAR,CONVERT(MONEY,@nNumber ),1) -- 756,846.70

Örnek 2:
DECLARE @nNumber AS FLOAT
SET @nNumber = 756846.6985
SELECT CONVERT(VARCHAR,CONVERT(MONEY,@nNumber ),1) -- 756,846.70

Sql'de bir sayının virgülden sonra belirtilen hane sayısı kadar gösterilmesi

Virgülden sonra 2 basamak gösterilmesi ile ilgili işlemler;

DECLARE @PRICE AS DECIMAL -- decimal tipinde değişken tanımlıyoruz
SET @PRICE = 2567.5698745 -- değer ataması yapıyoruz
select CAST (@PRICE AS DECIMAL(15,2)) -- DECIMAL(15,2) ile virgülden sonra 2 basamak alınmasını sağlıyoruz

Virgülden sonra 4 basamak gösterilmesi ile ilgili işlemler;

DECLARE @PRICE AS FLOAT
SET @PRICE = 2567.5698745
select CAST (@PRICE AS DECIMAL(15,4))

18 Aralık 2008 Perşembe

Veritabanındaki bir tablodan rastgele (random) kayıt getirmek

SELECT TOP 5 FROM ORDER BY NEWID()

SQL'de bir tablodaki kayıtlar arasında gezmek CURSOR FOR

Seçilen ilçeye göre uzaklık birimlerini veren bir tablomuz (tblkargo) olduğunu varsayalım. Bu tablo ilçeye göre uzaklık kolonu içerisinde U(uzak) , O(orta), Y(yakın) değerlerini içersin. Birde sabit kargo bedelimiz olsun, bu bedeli U ise 3, O ise 2, Y ise aynen alarak illere göre kargo bedeli çıkartalım. Ve bu sonuçları tblkargo tablosundaki fiyat kolonuna update edelim.

DECLARE @SabitKargoBedeli AS MONEY -- değişken tanımlama
SET @SabitKargoBedeli= 3 -- SabitKargoBedeline 3 atandı

DECLARE @uzaklik AS CHAR
DECLARE @ilceId AS INT
DECLARE @carpan AS INT
DECLARE kargo_cursor CURSOR
FOR
Select uzaklik,ilceId from tblkargo
OPEN kargo_cursor
FETCH NEXT FROM kargo_cursor INTO @uzaklik,@ilceId
WHILE (@@FETCH_STATUS <> -1) -- bitti mi
BEGIN
IF @uzaklik='U'
SET @carpan=3
ELSE IF @uzaklik='O'
SET @carpan=2
ELSE
SET @carpan=1

UPDATE tblkargo SET fiyat= @SabitKargoBedeli * @carpan WHERE ilceId=@ilceId

FETCH NEXT FROM kargo_cursor INTO @uzaklik,@ilceId
END
CLOSE kargo_cursor
DEALLOCATE kargo_cursor

17 Aralık 2008 Çarşamba

sys.objects

Oluşturulan tüm nesnelesin listesi

SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
ORDER BY modify_date;
GO

DB de oluşturulan Procedurelerin listesi

SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
WHERE type_desc='SQL_STORED_PROCEDURE';
GO

YADA

YADA

SELECT distinct OBJ.name
FROM sysobjects OBJ,
syscomments COM
WHERE OBJ.id = COM.id
AND OBJ.type IN ( 'P', 'TR' ) /* stored procedure & triggers */
AND COM.text LIKE '%spadı%'

spadı kısmına aradığınız bir sp adında geçen kelimeyi yazabilirsiniz

DB de oluşturulan Functionların listesi

SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION%';
GO

Veri Tabanında Kayıtlı Olan Tabloların Listesini Almak

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME

16 Aralık 2008 Salı

2'lik Sistemdeki Bir Sayının 16'lık Sisteme Çevirilmesi

public string Bin2Hex(string sData)
{
     string[] bData = new string[sData.Length / 4];
     int k = 0;
     for (int i = 0; i < sData.Length; i++)
    {
          bData[k] = sData.Substring(i, 4);
          i += 3;
          k++;
     }
     return String.Join("", (from c in bData
     select Convert.ToString(Convert.ToInt32(c.ToString(), 2), 16)).ToArray());
}

C# Nitelikleri (Attributes)

Nitelikler, uygulandıkları tiplerin (types) yada üyelerin (members) çalışma zamanındaki (run - time) davranışlarının değiştirilmesine olanak sağlayan abstract sınıflardır. Nitelikler (Attribute), CLR (Common Language Runtime) ile gelen nitelikler ve programcının ihtiyaçları doğrultusunda kendisinin oluşturduğu nitelikler olarak iki şekilde ayrılabilir. .Nette reflection (yansıma) ile birlikte kullanıldığından önemli bir konudur. Arayüzlere, arayüz elemanlarına, sınıflara, sınıf üyelerine , delegelere, yapılara nitelikler tanımlayabiliriz. En önemli özelliklerinden biri assemblyde yer alan tip ve üyelere ekstra bilgiler katabilmesidir. Bu bilgilerin nasıl kullanıcağı ile ilgili işlemler için reflection(yansıma) konusu çok önem taşımaktadır. Bu sayede çalışma zamanında bir tipin üyelerinin bilgisine yada metadata içeriğinin ne olduğuna erişebiliriz.

Nitelikler (Attribute) [ ] parantezleri içerisinde [NitelikAdi] şeklinde yazılırlar. Attribute'lerin parametreleri olabilir ve bu parametreler ',' ile verilebildiği gibi 'parametreAdi = deger' şeklinde de verilebilir.

11 Aralık 2008 Perşembe

(Assembly) DLL’lerin Sql Serverda Kullanılması

Assemblyler (*.dll) sql server üzerinde bir klasör içerisine atılır. Birbirini refere eden tüm assemblyler aynı klasör içinde olmalıdır. Refere eden assemly’nin SQL Server’a yüklenmesi yapıldığında refere edilmiş olan assemblyler de aynı anda SQL Server’a yüklenir.

Örneğin tüm assembly dosyalarını D klasörünün içinde bulunan DLL klasörüne atalım.

Trustworthy Computing(Güvenilir Hesaplama),
Microsoft’un önemsediği güvenlik vizyonunun başında gelen bir konu olup sistem üzerindeki tüm uygulamaların güvenli ve güvenilir bir şekilde ilerlemesini içerir.

SELECT is_trustworthy_on FROM sys.databases WHERE name = db_name()
ALTER DATABASE FulyaTest SET TRUSTWORTHY ON;
GO

SQL Server 2005’e CLR (Common Language Runtime) entegre edilmiştir. Bu entegrasyon veritabanı uygulamaları geliştirirken önemli esneklik sağlar. Özellikle CLR, extended stored procedure yazarken güçlü ve esnek bir yapı sağlar.

SQL Server 2005 ile gelen CLR entegrasyonu sayesinde hazır bir assembly SQL server üzerinden kullanılabilir. Lokal kaynakları içeren bir assembly’i başka bir assembly kullanıyor ise buna Uydu Assembly (Satellite Assembly) adı verilir.

SQL Server CLR entegrasyonunun kullanımı için ilk yapmamız gereken şey kullandığınız SQL Server instance’ında CLR entegrasyonunu aktif hale getirmektir. CLR entegrasyonunu aktif hale getirmek için 2 yöntem kullanılabilir;
  1. Başlat > Programlar > Sql Server 2005 > Configuration Tools > SQL Server Surface Area Configuration penceresini açalım. Açılan penceredeki seçenekler arasından “Surface Area Configuration for Features” seçtikten sonra açılan yeni penceredeki komponent listesinden “CLR Integration”ı seçip “Enable CLR Integration” kutucuğunu işaretleyelim.
  2. SQL Server Management Studio’yu açıp New Query seçeneğini seçtikten sonra aşağıdaki T-SQL komutunu da kullanırız. Bu komutun sonunda ise “reconfigure” komutu çalıştırılarak yapılan değişikliklere göre SQL Server’ın kendini yeniden yapılandırması sağlanır.

    --Veri tabanı için CLR aktif hale getiriliyor.
    sp_configure 'clr enabled', 1
    Reconfigure with override
    GO

    SQL Server 2005 de CLR’ı aktif hale getirdikten sonra D:/DLL klasöründe bulunan assembly dosyalarını SQL Server üzerinde oluşturmak için SQL Server Management Studio’yu açıp New Query seçeneğini seçtikten sonra aşağıdaki T-SQL komutunu da kullanırız.

    Not: Assemblyler derlenirken C:\WINDOWS\assembly (global assembly) klasörünede atılırlar. Derleme işlemi SQL Server üzerinde yapılmadığı için bu klösörde assemblyler yaratılmaz o nedenle D:\DLL klasörüne atmış olduğumuz assembly’leri bu klasörede kopyalamamızda fayda var.

    --Assembly yaratılıyor
    CREATE ASSEMBLY csmultipaycreditcard
    FROM 'D:\DLL\csdeneme.dll'
    WITH PERMISSION_SET=UNSAFE

    Not : Assembly oluşturulduktan sonra yüklendiği klasör ile hiç bir ilişkisi kalmaz. Bağımsız çalışır. Klasördeki assembly değşince değişmez. Tekrar oluşturulması gerekmektedir.

    CAS MODELİ (Yetkilendirme)
    PERMISSION_SET = SAFE --Veriye erişim yetkisi vardır. In-Proc veri sağlayıcısı sınıflarını kullanabilir. Dosya sistemi, ağ bağlantısı gibi dış kaynaklara erişim yetkisi yoktur. Varsayılan güvenlik modelidir.
    PERMISSION_SET = EXTERNAL_ACCESS --SAFE ile yapılan bilen tüm işlemlerin yapılabileceği gibi dosya sistemi, ağ bağlantısı, event loglar gibi dış kaynaklara erişim de sağlanabilir.
    PERMISSION_SET = UNSAFE --Bu güvenlik modeli ile çalışan kodlar üzerinde CASın hiç bir kısıtlaması yoktur.

    T-SQL komutunu çalıştırmamız ile birlikte Sql Server Management Studio’da Assembly’i oluşturduğumuz veri tabanının altında Programmability’nin altında Assemly nin içerisinde csdeneme ve varsa refere ettiği assembly'lerin de oluşmuş olduğunu görebiliriz.

    SELECT * FROM sys.assemblies – oluşturulmuş olan assemblyler.
    SELECT * FROM sys.assembly_files – assembly dosyalarının yüklendiği klasör listeleri

    -- Visiblity ayarları On/Off
    ALTER ASSEMBLY [csdeneme]
    Visiblity =Off

    -- Assembly 'i silmek için
    DROP ASSEMBLY [csdeneme]

SQL'de REPLACE() Kullanımı

Replace() metodu sql' de REPLACE(kolon_adi, değişecek_olan_değer , yeni_değer) şeklinde kullanılır.

Örneğin ürün bilgilerinin tutulduğu bir tabloda ürün özellikleri , ile ayrılmış olsun. Biz onları ekran görüntüsü alırken alt alta yazdırmak istiyoruz.



SELECT REPLACE(DESCRIPTION, ',', '\r\n') AS DESCRIPTION
FROM TBLPRODUCTS

TBLPRODUCTS tablomuzdaki DESCRIPTION (açıklama) kolonundaki verilerin içerisinde geçen ',' karakterini '\r\n' ile değiştirdik. Böylece bu sorguyu kodumuzda kullandığımız zaman verilerin alt alta yazıldığını göreceksiniz.

TBLPRODUCTS tablomuzdaki DESCRIPTION (açıklama) kolonundaki verilerin içerisinde geçen ',' karakterini '\r\n' ile değiştirip bu şekilde kayıtları güncellemek için ise aşağıdaki sorgu kullanılabilir.

UPDATE TBLPRODUCTS SET DESCRIPTION = REPLACE(DESCRIPTION, ',', '\r\n')

5 Aralık 2008 Cuma

String Bir İfadedeki Karakterleri Değiştirmek

String bir ifade içerisinde geçen bir karakteri belirtilen başka bir karakter ile değiştiren program.

static void Main()
{
      string str = "Fulya, Güler ,Şakir";
      string nStr= str.Replace(",", "\r\n");
      Console.WriteLine(nStr);
      Console.ReadKey();
}

Kodun İşleyişi

"Fulya, Güler ,Şakir" ifadesinde yer alan "," karakteri "\r\n" ile değiştiriliyor. Ve yeni değişken ekrana yazdırılıyor.

Bu işlemler nasıl gerçekleşiyor?

Tanımlı str değişkenindeki  "Fulya, Güler ,Şakir" değeri aşağıdaki kod satırı sayesinde "," karakteri "\r\n" ile değiştiriliyor.

Kod satırı: str.Replace(",", "\r\n");

String Parçalama İşlemi

String bir ifadeyi içerisinde geçen bir karaktere göre parçalayıp diziye (array) dönüştürüp, dizi değişkenlerini ekrana yazdıran program.

Örneğin :
"Fulya Odabaşı,Meral Özkan,Nihal Köprülü,Songül Yeşilyurt" bilgisi olsun isim soyad bilgilerini ',' e göre ayırarak alt alta yazdırmak istiyoruz.

static void Main(string[] args)
{
      string str = "Fulya Odabaşı,Meral Özkan,Nihal Köprülü,Songül Yeşilyurt";
      string[] bStr = str .Split(',');
      for (int i = 0; i < bStr.Length(); i++)
      {
             Console.WriteLine(bStr[i].ToString());
      }
}

.Net 3.5 LINQ - Sayıyı 16'lık sistemden 2'lik sisteme çevirme

static void Main()
{
string bNumber = HexToBin("15C784");
}

public static string HexToBin(string str)
{
return String.Join("", (from chr in str.ToCharArray()
select Convert.ToString(Convert.ToInt32(chr.ToString(), 16), 2).PadLeft(4, '0')).ToArray());
}

Kodun İşleyişi

HexToBin method'u kendisine parametre olarak gönderilen 15C784 değerini 2'lik sisteme çevirerek 000101011100011110000100 değerini döndürür. Böylece bNumber değişkeninin değeri 000101011100011110000100 oluyor.

Bu işlemler nasıl gerçekleşiyor?

Öncelikle HexToBin methoduna parmetre olarak gönderilen 15C784 değeri char array'e dönüştürülüyor. Ve dizi değişkenleri döngü içerisine alınıyor.
Kod satırı: from chr in str.ToCharArray() select

Şimdi döngünün ilk adımında olduğumuzu düşünelim char array'in ilk değeri 1 olacaktır.

Convert.ToInt32(chr.ToString(), 16) //1 değerini 16 sisteme çevriliyor.

Convert.ToString(Convert.ToInt32(chr.ToString(), 16), 2) //16 lık sisteme çevrildikten sonra 2 lik sisteme çevriliyor.

PadLeft(4, '0') //eğer oluşan string 4 uzunluğundan küçük ise sol tarafına '0' ekliyor.

Convert.ToString(Convert.ToInt32(chr.ToString(), 16), 2).PadLeft(4, '0')).ToArray() //ve elde edilen string tipindeki veri array'a dönüştürülerek String.Join ile birleştiriliyor.

String.Join(string separator, string[] value) kendisine ilk parametre olarak verilen separator(ayırıcı) ile ikinci parametre olarak verilen array'i birleştirir.
Örneğin String.Join e separator olarak "," vermiş olsaydık dönen değer 0001,0101,1100,0111,1000,0100 şeklinde olacaktı.