C# Çoklu Form Uygulamaları ve Formlar Arası Veri Alış Verişi

Geliştirilen uygulamaların nerede ise tamamında birden fazla ekran kullanılmaktadır. Bu yazımızda birden fazla ekran içeren uygulamalarda ekranların beraber kullanılması ve ekranlar arası veri alış verişini inceleyeceğiz.

Bir ekranda iken ikinci bir ekranı açmak için iki metot bulunmaktadır. Bu metotlar ve açıklamaları;

  • [Form].Show() : Açılacak form açıldıktan sonra ana form kullanılmaya devam edilebilir şekilde açılır.
  • [Form].ShowDialog(): Açılacak form, açıldıktan sonra ana form kullanılamaz. Açılan form kapandıktan sonra ana form kullanılabilir. Kullanıcıya soru sorulacağı zaman çoğunlukla kullanılır. Bununla ilgili MessageBox yazımızı inceleyebilirsiniz.

İki metotta da öncelikle açılacak formu bir örneği oluşturulduktan sonra ihtiyaca göre Show veya ShowDialog metotları ile form açılır.

Form form1 = new Form1();
form1.Show();

Aşağıdaki videomuzda çoklu form uygulamaları ve formlar arası veri alış veriş yöntemlerini ayrıntılı şekilde bulabilirsiniz.




Visual Studio Otomatik Tamamlama (Intellisense)

İyi bir yazılımcı olmak için kaliteli kod yazmanın yanında kullanılan IDE’nin de iyi kullanabilmesi gerekmektedir. Aşağıdaki YouTube videomuzda kendi adıma en başarılı bulduğum IDE olan Visual Studio’nun otomatik kod tamamlama özelliğini inceliyoruz.




Veeam Agent İle Kişisel Bilgisayar Yedekleme

Mükemmel çalışan bir sisteminiz var, satır satır kodlar projelerde akıyor ve bir SHIFT – DEL tuşuna bastınız eski bir klasörü sileceksiniz diye ve o da ne projeyi silmişsiniz veya akşam projeyi derlediniz sabah müşteriye teslim etmek üzere bilgisayarı kapattınız ve sabah bilgisayar açılmadı… İki senaryoda da yedekleme stratejiniz yok ise bütün emekler heba oldu.

Bu noktada yedekleme söz konusu olunca ilk akla gelen Veeam firmasının kişisel bilgisayarlar için ücretsiz olan Microsoft Windows için Veeam Agent uygulamasını kullanabiliriz. Hem full backup hem fark bacup alabiliyor olması ve sadece bütün sistemi değil de alınan yedek dosyalarının içinden sadece gerekli dosyanın alınabilmesine olanak sağlaması uygulamayı son derece kullanışlı yapmaktadır.

  • Full Bacup: Sistemin tamamının yedeklendiği yedekleme çeşidi
  • Fark Bacup: Sistemin alınan son Full yedeği ile fark backup alınan zaman arasında sadece değişen verilerin yedeklendiği yedekleme çeşididir. Full bacuptan en önemli farkı, çalışabilmesi için kendisinden önce alınan full bacup dosyasının olması gerekmektedir aksi durumda fark bacup dosyasının olması bir anlam ifade etmeyecektir.

Uygulama https://www.veeam.com/tr/windows-endpoint-server-backup-free.html linkten indirilebilir. İndirmek için bir Veeam üyeliği gerekmektedir, ücretsiz bir hesap açtıktan sonra indirme işlemi yapılabilir.

Yedekleme İşleminin Ayarlanması

Veaam yedekleme sistemi ücretli sürümlerinde birden fazla yedekleme görevi tanımlamaya izin veriyor olsa da ücretsiz sürümü tek göreve izin vermektedir.

Yedekleme görevi tanımlamaya uygulamamızı açarak başlayalım.

Veeam Agent for Microsoft Windows Uygulamasının Açılması

Uygulamamızı açtıktan sonra karşımıza çıkan ilk ekranda tanımlanacak görevin adı ve açıklamasını girmemizi isteyen ekrandır. Gerekli bilgileri girip Next butonu ile sonraki ekrana geçelim.

“Backup Mode” tabında yedeklemenin ne seviyede olacağı seçilir.

  • Entire computer (recommended): Bütün bilgisayarı yedekler. “Include external USB drivers” seçilmesi durumunda bilgisayara takılı olan USB bellekleri de yedekler.
  • Volume level backup: Bilgisayarda birden fazla disk bölümü var ise disk bölümü bazında yedekleme yapar.
  • File level bacup: Dosya bazında yedekleme yapar.

Biz bu makalemizde bilgisayar yedekleme üzerine yoğunlaşacağımızdan dosya bazında yedekleme konusuna girmeyeceğiz.

Bu aşamada “Volume level backup” seçilirse “Next” butonuna tıklandıktan sonra aşağıdaki gibi hangi disk alanlarının yedekleneceğinin seçilmesine imkan tanıyan ekrana geçiş yapılacak.

Bu ekranda yedeklenecek disk alanları seçildikten sonra “Next” butonu ile yedeklerin nereye alınacağının seçileceği ekrana geçiş yapılır.

Açılan “Destination” tabında bulunan yedek alma konumu seçeneklerinden yedeğin alınacağı yer seçilerek “Next” butonu ile yedek alanı yolunun ayarlanacağı ekrana geçiş yapılır.

  • Local storage: Bilgisayara bağlı bir USB diske veya “Volume level bacup” yedekleme stratejisi seçildi ise bilgisayar içerisindeki başka bir disk bölümüne yedekleme alınmak için kullanılır
  • Shared folder: Ağ üzerinden paylaşılan bir klasöre yedekleme almak için kullanılr

“Local storage” seçilmesi durumunda aşağıdaki gibi yedeğin alınacağı klasörün seçileceği ekran açılır. “Browse” butonu ile klasör seçme ekranı açılarak, klasör seçimi yapılır.

Ağ üzerinden paylaşılmış bir klasöre yedekleme yapmak için “Shared folder” seçildiyse de aşağıdaki gibi klasör yolunu ve gerekiyorsa kullanıcı adı ve şifreyi girmek için ilgili ekran açılır.

Ekranda bulunan alanlar:

  1. Klasörün ağ üzerindeki adresi
  2. Gerekiyorsa kullanıcı adı ve şifresi (Gerekmiyorsa “This share requires…” seçeneğindeki seçim kaldırılır)
  3. Klasörde geriye dönük kaç günlük yedek tutulacağını belirtir. Girilen gün sayısından eski yedekler otomatik silinir. Aynı ayar “local storage” yedek alındığında da geçerlidir.

Gerekli yol bilgisi, kullanıcı adı ve şifre girildikten sonra “Populate” butonuna tıklanırsa yedeğin alınacağı diskin toplam alanı ve kalan boş alan bilgisi “n/a” kısmına yazılacaktır. “Advanced” butonu ile de tam yedek alınacak zamanların seçilmesi için gerekli ayarların girileceği ekran açılır.

“Create active full backups perodically” seçeneği seçilerek tam yedeklerin alınacağı zamanlar seçilebilir hale gelecektir. İlk seçenek “Monthly on:” seçeneği aylık olarak tam yedekleme alır. “Months” butonu ile yedekleme alınacak aylar seçilebilir.

İkinci seçenek ise haftalık olarak tam yedekleme alır, “Days” butonu ile tam yedek alınacak günler seçilebilir.

Alınan yedek dosyalarının şifrelenmesi isteniyorsa “Storage” tabında “Encryption” alanında istenen şifre ve hatırlatıcı ipucu yazılır.

Tam yedekleme işlemleri tamamlandıktan sonra “OK” butonu ile ekran kapatılır ve “Next” butonu ile yedeklemeyi otomatik yapmak için “Schedule” tabına geçiş yapılır.

  • Daily at: Yedeklemenin başlayacağı saat. Yanındaki açılır menüden;
  • “Everyday : Her gün, On week-days: Hafta içi günleri veya On these days: Sadece şu günlerde” seçeneklerinden biri seçilir.

“Apply” denildikten sonra günlük yedeklemeleri alabilmek için bilgisayarı uyku modundan çıkarmak için yetki isteyen bir ekran açılır, “Yes” diyerek işlem tamamlanır.

Yedekleme Sonucunun Mail Olarak Gönderimini Sağlama

Yedekleme sonunda hata veya başarılı olma durumları mail olarak iletimini sağlamak için ayarlar menüsünde “Enable email notifications” seçeneği aktif edilir.

Mail gönderimi için gereken SMTP ayarları için “Configure and test” tıklanarak SMTP ayarları ekranı açılır.

Gerekli SMTP ayarları girildikten sonra geri butonuna tıklanarak ayarlar menüsüne dönüş yapılır. Ayarlar otomatik kaydedilecektir.

Silinen Dosya veya Klasörü Yedekten Kurtarmak

Silinen bir klasör veya dosyayı yedekten almak için “File Level Restore” uygulamasının açılması gerekmektedir.

Açılan ilk ekranda yedek dosyalarının nerede olduğunu soran ekrandır. Yedek dosyalarımız bilgisayarda veya bir USB diskte ise “Local storage” seçeneğinde “Browse” butonu ile silinen veriyi içerisinde bulunduran yedek dosyası seçilir.

Yedek dosyası ağ üzerinde paylaşılan bir klasörde ise “Network storage” seçeneği seçilerek “Next” butonu ile yedek dosyasının yerinin seçildiği ekrana geçiş yapılır.

Ücretsiz sürümde uzak konum olarak sadece “Shared folder” desteklendiğinden seçili bırakıp “Next” butonu ile ağ yolu ayarları ekranına geçiş yapılır.

Yedekleme görevi ayarlanırken kullanılan ekran gibi gerekli ayarlar girilerek “Next” butonu ile yedek dosyalarına ulaşılır.

“Next” butonu ile girilen bilgiler doğru ise girilen konumdaki yedekleme dosyalarını listelenir.

Bu örneğimizde iki tane yedekleme görünmesinin nedeni “Backup Job MBT02” görevinin makaleyi yazmadan önce bilgisayarımda tanımlı olan yedeklerin aynı konumda olmasından dolayıdır. Bu göreve ait ayrıntı açıldığında görev içerisinde bulunan bilgisayarlar listelenir. Yedekten dönülecek bilgisayar seçildikten sonra “Next” butonu ile alınan yedekler listelenir.

Bu ekranda bilgisayara ait kullanılabilir bütün yedekleme noktaları listelenir. Biz örneğimizde silinen dosyanın sabah alınan yedekte olduğunu varsayıyoruz. Yedeği seçip “Next” butonu ile yedek içeriğine ulaşılır.

“Next” butonuna tıklandıktan sonra son onay ekranı gelir. “Open” butonuna tıklanarak yedek içerisinde ki dosyalara ulaşılır.

“Open” butonuna basıldıktan sonra network hızına bağlı olarak bir süre sonra aşağıdaki gibi yedek dosyasının içerisini gösteren ekran açılır. Kurtarılacak klasör veya dosyanın üzerine sağ tıklayarak “Copy To…” seçeneği ile dosyanın kaydedileceği yer seçilir.

Dosyanın kaydedileceği klasör seçildikten sonra “OK” butonu ile yedek dosyasından kurtarma işlemi başlatılır. Kopyalama işlemi bittikten sonra klasör veya dosya belirtilen klasöre kurtarılmış olur.

Bilgisayarın Çökme İhtimaline Karşı Boot Medyanın Oluşturulması

Bilgisayarın tamamen çökmesi durumunda Veeam uygulamasının oluşturduğu boot medya ile sistemi başlatıp, sistemin tamamı alınan yedek noktalarından istenen noktaya dönülebilir. Boot medya oluşturmak için “Create Recovey Media” uygulaması başlatılır.

Açılan ilk ekran boot medianın kaydedilebileceği ortamların listelendiği ekrandır. Bilgisayarımızda herhangi bir DVD sürücü olamadığında sadece ISO dosyası olarak oluşturma seçeneği var. Varsayılan ayarında bırakılıp “Next” butonu ile dosyanın kaydedileceği alanın seçildiği ekrana geçiş yapılır.

Açılan “Image Path” ekranda oluşacak iso dosyasının kaydedileceği yer ve gerekiyorsa kullanıcı adı ve şifre girilerek “Next” butonu ve ardından açılan ekranda “Create” butonuna tıklanarak boot medya oluşturma işlemi başlatılır. İşlem sonunda oluşan iso dosyası bilgisayarın çökme ihtimaline karşı bilgisayar dışında, tercihen yedek dosyaları ile aynı konumda muhafaza edilir.

Çöken Bilgisayarın Yedekten Kurtarılması

Çöken bilgisayarı yedekten kurtarmak için bilgisayarın oluşturulan Recovery Medya ile başlatılması gerekmektedir. Bilgisayar bu boot medya ile başlatıldıktan sonra aşağıdaki gibi bir ekran açılacaktır.

“Bare Metal Recovery” seçeneği tıklanarak sistemin bir Veeam yedekleme dosyasından kurtarılacağı belirtilir.

Alınan yedek ağda olduğundan “Network storage” seçeneği seçilerek “Next” butonu ile yedeğin olduğu alanın ayarlarının girileceği ekrana geçiş yapılır.

Yedeğin ağ üzerinde paylaşılan klasörde olduğunu belirtip “Next” butonu ile sonraki ekrana geçiş yapılır.

Yedek dosyası yolu ve gerekiyorsa kullanıcı adı ve şifre girilerek “Next” butonu ile sonraki ekrana geçiş yapılır.

Açılan ekranda belirtilen konumda yedekleri alınan bilgisayarlar listelenir. Yedekten dönülecek bilgisayar seçilerek “Next” butonu ile sonraki ekrana geçilir.

Açılan yeni ekranda seçilen bilgisayara ait yedekleme noktaları listelenir. Burada sistem hangi tarihe dönülecekse seçilerek “Next” butonu ile sonraki ekrana geçiş yapılır.

Açılan yeni ekranda sistemin hangi bölümlerinin yedekten dönüleceği seçilerek “Next” butonu ile sonraki ekrana geçiş yapılır.

  • Entire computer: Bütün bilgisayar yedekten döner
  • System volumes only: Sadece işletim sistemi bölümlerinin yedekten dönülmesini sağlar. Bu seçenek dokümanların işletim sistemi diskinde tutulmadığı (D, E vb.) bilgisayarlarda veri kaybının en aza indirir.

Yedekten dönme işlemi öncesi son bir özet ekranı gelir. “Restore” butonu ile yedekten dönme işlemi başlatılır.

Yedekten dönme işlemi sırasında aşağıdaki gibi bir ekrandan işlemin durumu takip edilebilir.

Yedekten dönme işlemi bittikten sonra “Finish” butonuna tıklanarak sistem yeniden başlatılır ve hayat normale döner.

Yedek tam dönme işlemi yapılan bilgisayar bir domaine üye olan bilgisayar ise domain ilişkisini yeniden kurması adına bazen bilgisayarı domainden çıkarıp tekrar domaine almak gerekebilmektedir.

Yedekleme demişken son söz olarak şunu diyebiliriz; yedeği alınmamış veri sizin olmamış veridir diyebiliriz. Yedekleme profesyonel çalışmalarda o derece önemli ki sistemin kurulumuna harcanan maliyet hatta bazen daha fazlası yedekleme sistemi için harcanabiliyor.




Visual Studio Arama – Değiştirme – Yardım

İyi bir yazılımcı olmak için kaliteli kod yazmanın yanında kullanılan IDE’nin de iyi kullanabilmesi gerekmektedir. Aşağıdaki YouTube videomuzda kendi adıma en başarılı bulduğum IDE olan Visual Studio’nun arama ve değiştirme özelliklerini inceliyoruz.




Visual Studio Kod Editörü

İyi bir yazılımcı olmak için kaliteli kod yazmanın yanında kullanılan IDE’nin de iyi kullanabilmesi gerekmektedir. Aşağıdaki YouTube videomuzda kendi adıma en başarılı bulduğum IDE olan Visual Studio’nun kod editörünün en çok kullanılan özelliklerinden bazılarını inceliyoruz. Video içerisinde incelediğimiz bazı konu başlıkları:

  • Kod bloğunda gruplama yapmayı sağlayan #region özelliği
  • Kod formatlama
  • Editör içerisinde satır numarası gösterme ve satır sonunda kodu yeni satırdan devam ettirme
  • Boşluk üzerinde yapılan kopyalama işleminin hafızadaki asıl işlemi silmesini engelleme
  • Yazılan sınıf ve metotların nerelerde kullanıldığını tespit etme
  • Aynı anda üzerinde çalışılan kod sayfasının iki ayrı bölümüne gözatma
  • Kodu toplu olarak yorum haline getirme
  • Aynı anda birden fazla satırda düzenleme yapma
  • Kopyalama işleminin tarihçesinden son 20 kopyalama işlemini görme
  • Scroolbar üzerinde kodun ön izlemesini aktifleştirme
  • Class View ve Object Browser ile sınıfların ayrıntılarını inceleme
  • Kod içerisine görev tanımlama




T-SQL Gerçek Ad ve Soyadlarından Rastgele Veri Üretmek

Kimi zaman test ortamlarında kullanılmak üzere rastgele oluşturulmuş verilere ihtiyaç duyulmaktadır. Bu ihtiyaçların başında da rastgele oluşturuluş kullanıcı listesidir. Bu yazımızda kullanıcıların adı ve soyadlarını bir kolonda tutan (FullName) veri tabanı için rastgele ad soyad listesi ve bu ad soyad listesinden faydalanarak kullanıcı adları ve mail adresleri oluşturacağız.

Bu işlem için adımlarımız şöyle olacak;

Mevcut gerçek verileri tutmak için bir geçici tabloyu ve gerekli değişkenleri oluşturacağız.

drop table if exists #Names

create table #Names(
userName nvarchar(100) null,
[Name] nvarchar(200),
[Surname] nvarchar(200)
)

declare @n nvarchar(200)  -- ad
declare @sn nvarchar(200) -- soyad
declare @un nvarchar(200) -- kullanıcı adı
declare @id int -- gerçek verinin Id değeri
declare @max int -- gerçek verinin satır sayısı

Rastgele sayı üretimi için aralığı tespit etmek için gerçek verinin satır sayısı @max değişkenine atanır.

select @max = COUNT(*) from Users

Gerçek veriden ad soyad alanı sorgulanarak SUBSTRING ve CHARINDEX fonksiyonları yardımı ile ilk boşluk karakterinden ad soyad (FullName) alanı ad ve soyad alanlarına ayrıştırılıp oluşturulan geçici tabloya eklenir. TRIM fonksiyonu ile de soyadın başında oluşan boşluk karakterleri silinir.

insert into #Names([Name], [Surname])
select SUBSTRING(FullName,0, CHARINDEX(' ', FullName)), 
SUBSTRING(FullName,CHARINDEX(' ', FullName),200)
from Users  where CHARINDEX(' ', FullName) > 1

update #Names set [Surname] = TRIM([Surname])

Geçici tabloya ad soyadlar alındıktan sonra CURSOR yardımı ile gerçek tablo baştan sona dönülerek her satırın Id değeri alınır ve her satırda ORDER BY NEWID() işlemi ile rastgele bir ad ve soyad seçilir. Ad ve soyad seçildikten sonra adın ilk harfi, soyadın tamamı ve sonuna 1 – @max değişkeni arasında rastgele bir sayı ile birleştirilerek kullanıcı adı oluşturulur. Kullanıcı adı oluşturulurken kullanıcı adının daha önce oluşmuş olma ihtimaline karşılık while exists (select UserName from Users where UserName = @un) döngüsü ile oluşturulan kullanıcı adında bir kullanıcı adı var olduğu sürece yenisini oluşturulur. REPLACE fonksiyonu ile de kullanıcı adındaki Türkçe karakterler silinir. Soyadı seçerken de where CHARINDEX(‘ ‘, [Surname]) = 0 şartı ile sadece tek soyadı olanlar arasından seçim yapılır.

--SQL CURSOR KULLANIMI

	DECLARE crs CURSOR FOR
	
	SELECT Id FROM Users -- Cursur de işlenecek veriler ve listeyi select sorgusu ile çekiyoruz .

	OPEN crs -- Cursor ü açıyoruz

	FETCH NEXT FROM crs INTO @id -- Select sorgusunda gelen sütunlar sırasına göre değişkenlere atanır Örn : @id = Id

	WHILE @@FETCH_STATUS =0
		BEGIN
			
			select @n = [Name] from #Names order by NEWID()
			select @sn = [Surname] from #Names where CHARINDEX(' ', [Surname]) = 0 order by NEWID()
			set @un = lower(SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1)))
			set @un = REPLACE(@un,'ç', 'c')
			set @un = REPLACE(@un,'ı', 'i')
			set @un = REPLACE(@un,'ğ', 'g')
			set @un = REPLACE(@un,'ö', 'o')
			set @un = REPLACE(@un,'ş', 's')
			set @un = REPLACE(@un,'ü', 'u')

			while exists (select UserName from Users where UserName = @un)
			begin
				set @un = lower(  SUBSTRING(@n,1,1)+@sn+CONVERT(varchar, CONVERT(int, RAND()*@max+1)))
				set @un = REPLACE(@un,'ç', 'c')
				set @un = REPLACE(@un,'ı', 'i')
				set @un = REPLACE(@un,'ğ', 'g')
				set @un = REPLACE(@un,'ö', 'o')
				set @un = REPLACE(@un,'ş', 's')
				set @un = REPLACE(@un,'ü', 'u')
			end
			
			update Users set FullName = @n + ' ' + @sn, UserName = @un where Id = @id

			FETCH NEXT FROM crs INTO @id
 
		END

	CLOSE crs -- Cursor ü kapatıyoruz.

	DEALLOCATE crs -- Cursor ile işimiz bittiğinde sistemden tamizlememiz için DEALLOCATE etmemiz gerekmektedir.

Son işlem olarak kullanıcı adlarının sonuna ilgili domain adı eklenerek mail adresleri oluşturulur.

update Users set Email = UserName + '@domain.com'

Bütün kod: https://github.com/saitorhan/T-SqlExamples/blob/master/randomnames.sql




Visual Studio Seçenekler ve Özelleştirme

İyi bir yazılımcı olmak için kaliteli kod yazmanın yanında kullanılan IDE’nin de iyi kullanabilmesi gerekmektedir. Aşağıdaki YouTube videomuzda kendi adıma en başarılı bulduğum IDE olan Visual Studio’da görünümü özelleştirme ve ayarlarından bazıları inceliyoruz. Video içerisinde incelediğimiz bazı konu başlıkları:

  • Visual Studio başlangıç ayarları
  • Visual Studio senkronizasyonu
  • Pencerelerin ekrandaki konumları
  • Visual Studio ayarlarının yedeklenmesi ve yedekten geri dönülmesi




SQL Server String Fonksiyonları

Yazılımın her alanında olduğu gibi SQL Server üzerinde de en sık yapılan işlemler string işlemleridir. Bu yazımızda SQL Server içerisinde kullanılan string fonksiyonlarını işliyor olacağız.

ASCII

Parametre olarak aldığı stringin ilk harfinin ASCII karşılığını verir.

SELECT ASCII('ABC') AS A, ASCII('B') AS B,   
ASCII('a') AS a, ASCII('b') AS b,  
ASCII(1) AS [1], ASCII(2) AS [2];

CHAR

ASCII fonksiyonunun tersine parametre olarak aldığı int değerinin karakter karşılığını vermektedir.

SELECT CHAR(65), CHAR(66), CHAR(97), CHAR(98), CHAR(49), CHAR(50)

CHAR fonksiyonu kullanılarak yeni satır, tab, satır başı gibi kontrol karakterleri de insert dilebilir. Örneğin aşağıdaki örnekte kişinin adı ve soyadı araya enter karakteri eklenerek alt alta yazıyor.

DECLARE @N NVARCHAR(40)
SET @N = 'Sait' + CHAR(13) + 'ORHAN'
PRINT @N

CHARINDEX

Verilen iki parametreden ilk verilen değeri ikinci parametre içerisinde arar ve bulduğu ilk indeksi verir. Üçüncü parametre de isteğe bağlı ve verilmesi durumunda verilen indekten sonrası için arar. Aranan değer bulunmaz ise 0 değerini döner.

select CHARINDEX('HAN', 'Sait ORHAN')
select CHARINDEX('HAN', 'Sait ORHAN', 7)

CONCAT 

Parametre olarak aldığı string değerlerini birleştirir.

SELECT CONCAT ( 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

CONCAT_WS

Concat fonksiyonu ile aynı şekilde çalışır ancak fark olarak stringleri birleştirirken araya ilk parametreyi koyar. Örneğin aşağıda yukarıdaki örneği “,” ile birleştiriyor.

SELECT CONCAT_ws (',', 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

LEFT

İki parametre alır. İlk parametre bir string değer alır, ikinci parametre olarak bir int değer alır. Sonuç olarak int değeri kadar harfi stringin solundan döndürür.

SELECT LEFT('SAİT ORHAN', 3), LEFT('SAİT ORHAN', 4), LEFT('SAİT ORHAN', 6), LEFT('SAİT ORHAN', 7)

LEN

Parametre olarak aldığı string değerin uzunluğunu döndürür.

SELECT LEN('SAİT ORHAN')
------------Sonuç
-- 10

LOWER

Parametre olarak aldığı stringin tümünü küçük harfe çevirerek dödürür.

SELECT lower('SAİT ORHAN')
------------Sonuç
-- sait orhan

LTRIM

Parametre olarak aldığı stringin solunda olan bütün boşlukları kaldırır.

SELECT LTRIM('     SAİT ORHAN      ')

PATINDEX

İlk parametrede aldığı paterni ikinci parametrede verilen strin içerisinde arar ve bulduğu ilk indeki döndürür. Bulamazsa 0 döner.

select PATINDEX('%R_A%', 'SAİT ORHAN')
select PATINDEX('%R%', 'SAİT ORHAN')
select PATINDEX('SA%', 'SAİT ORHAN')
select PATINDEX('%AN', 'SAİT ORHAN')

REPLACE

Üç parametre alır. İkinci parametrede verilen string değeri birinci parametrede verilen string içerisinde arar ve üçüncü parametrede verilen değer ile değiştirir. Örneğin aşağıdaki örnekte “sai1orhan1” string değerinde geçen “1”leri “2” olarak değiştiriyor.

SELECT REPLACE('sai1orhan1', '1', '2')
--Sonuç
-- sai2orhan2

REPLICATE

Birinci parametrede verilen string değerini ikinci parametrede verilen sayı kadar tekrar ederek döner.

SELECT REPLICATE('12', 3)
--Sonuç
-- 121212

REVERSE

Verilen string değeri ters çevirir.

SELECT REVERSE('123456789')
--Sonuç
-- 987654321

RIGHT

LEFT fonksiyonu ile aynı çalışır. Farkı metni sağdan alıyor olmasıdır.

RTRIM

LTRIM fonksiyonu ile aynı çalışır. Farkı stringin sağındaki boşlukları siliyor olmasıdır.

SPACE

Parametre olarak aldığı sayı değeri kadar boşluk döndürür.

SELECT 'SAİT' + SPACE(7) + 'ORHAN'
SELECT 'SAİT' + SPACE(16) + 'ORHAN'
SELECT 'SAİT' + SPACE(2) + 'ORHAN'

STRING_AGG

Select sorgusunda birinci parametre olarak kendisine verilen kolon değerini ikinci parametrede verilen karakter ile bölerek gösterir. Aşağıdaki örnekte Code alanını arasına “,” koyarak gösteriyor

SELECT STRING_AGG(Code, ',') from DocsTypes
--Sonuç
-- EN,FR,KA,LS,OR,PL,PR,PS,SE,ST,TL,TS

STRING_SPLIT

Birinci parametrede verilen metni ikinci parametrede verilen karaktere göre ayrıştırır. Geriye value adında kolon barındıran ve satırlarında karaktere göre ayrıştırma sonucunu tutan bir tablo döner.

SELECT * from STRING_SPLIT('Bu metin boşluk karakterine göre ayrıştırılacak', ' ')

SUBSTRING

String içerisinden belli bir bölümü döndürür. Üç parametre alır. İlk parametrede işlem yapılacak string değeri, ikinci parametrede alınacak alt parçanın başladığı index değeri ve son parametre olarak da alınacak alt parçanın uzunluğunu alır.

SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 1, 4)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 5, 10)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 25, 1000)

--Sonuç
-- Bu m
-- etin boşlu
-- ine göre ayrıştırılacak

TRIM

LTRIM ve RTRIM ile aynı çalışır. Farkı stringin hem sağ hem solundan boşlukları siliyor olmasıdır.

UPPER

LOWER ile aynı çalışır. Verilen stringin tamamını büyük harfe çevirir.




Visual Studio Solution Explorer – Toolbox – Properties İnceleme

İyi bir yazılımcı olmak için kaliteli kod yazmanın yanında kullanılan IDE’nin de iyi kullanabilmek gerekmektedir. Aşağıdaki YouTube videomuzda kendi adıma en başarılı bulduğum IDE olan Visual Studio’da proje yapısının kontrol edildiği Solution Explorer ve görsel programlama yapılırken kullanılan Toolbox kısımlarını inceliyoruz. Video içerisinde incelediğimiz bazı konu başlıkları:

  • Solution içerisine proje ekleme
  • Projeye referans ekleme
  • Nuget Paket Yöneticisi ile ihtiyaç duyulan ek dll dosyalarını internetten bulup projeye ekleme
  • Web Servis kullanma ve Web Servis ile NVİ üzerinden gerçek kimlik numarası doğrulama
  • Toolbox’a harici eleman ekleme
  • Seçenekler (Properties) ekranı ve özellikleri




SQL Server Veri Tabanı Snapshot Alma

Snapshot ifadesi genel olarak anlık sistemin anlık fotoğrafı olarak tanımlanabilir. Snapshot alma amacı, sistemin anlık görüntüsünü alıp sonradan sistemi önceki haline döndürmek gerekmesi durumunda döndüre bilmektir. Snapshot alındıktan sonra anlık görüntü için bir fark dosyası oluşturulur. Bu andan itibaren veri tabanında bir değişiklik yapıldığında verinin snapshot alındığı andaki hali bu fark dosyasına yazılır ve alınan bu snapshot veri tabanına bir select sorgusu geldiğinde veri değişmemişse orijinal veri tabanından, veri değişti ise önceki halini tutan snapshot veri tabanından sorgu çekilir.

SQL Server Management Studio görsel olarak snapshot alma işlemini desteklemediğinden işlemlerin T-SQL kodu ile yapılması gerekmektedir. Oluşturulan snapshotlar SSMS’de “Database Snapshots” bölümünü altında yer alır.

Oluşturulan bu snapshot veri tabanları salt okunur veri tabanlarıdır ve sadece select cümleciğini desteklerler.

Snapshot veri tabanı üzerinde UPDATE işlemi ve alınan hata

SSMS Database Snapshots

Snapshot almak için yazılması gereken T-SQL kodu aşağıdaki gibidir.

CREATE DATABASE snapshot_olarak_olusturulacak_dbAd

ON

(

NAME =Mantıksal_dosya_ad,

FILENAME ='olusturulacak_dosya_tam_ad'

)

AS SNAPSHOT OF kaynak_dbAd

Aşağıdaki kodda da AdventureWorks veri tabanının bir snapshotunun alınmasını görüyoruz.

CREATE DATABASE AdventureWorks_dbss1800 ON  
( NAME = AdventureWorks2017,
FILENAME =   
'C:\Db\AdventureWorks_data_1800.ss' )  
AS SNAPSHOT OF AdventureWorks2017;  
GO  

Aşağıda snapshot alındıktan sonra değiştirilen verinin orijinal veri tabanından ve aynı verinin snapshot veri tabanından sorgulanması ve sonucunu görüyoruz.

--Snapshot alındıktan sonra değiştirilen veri sorgusu
select 'Orijinal Veri', FirstName, LastName from AdventureWorks2017.[Person].[Person] where BusinessEntityID = 1

--Snapshot alındıktan sonra değiştirilen verinin snapshot veri tabanından sorgusu
select 'Snapshot Veri', FirstName, LastName from AdventureWorks_dbss1800.[Person].[Person] where BusinessEntityID = 1

Sistemde Var Olan Snapshotları Görmek için sys.databases kataloğundan source_database_id değeri NULL olmayan veri tabanları sorgulanır.

select * from sys.databases where source_database_id is not null

Veri tabanının snapshot zamanında ki durumuna dönmek için de aşağıdaki kodu kullanabiliriz. Snapshot verisine dönebilmek için veri tabanına kullanıcıların bağlı olmaması gerekmektedir. Kullanıcıların bağlı olması durumunda geri dönme sırasında aşağıdaki hata alınır.

USE master;  
-- AdventureWorks2017 veri tabanını AdventureWorks_dbss1800 zamanına döndürme  
RESTORE DATABASE AdventureWorks2017 from   
DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';  
GO  

Geri dönüş olduktan sonra az önce değiştirdiğimiz veriyi asıl veri tabanından sorgulayıp sonucu görelim.

Yazımızı bitirmeden snapshot veri tabanları konusunda söylememiz gereken son bir konu da, snapshotların kendi başlarına bir veri tabanı olmadıkları ve sistemde yaşamaları kaynak veri tabanlarının sistemde yaşıyor olması gerekliliğidir.