Enum Değerlerini foreach Dönmek

Enum değerleri yazılım geliştiricilerin en sık kullandığı ve en faydalı yapılardan biridir. Bazı durumlarda enum yapısının içerdiği bütün değerleri dolaşmak gerekmektedir. Bu durumda kullanılan iki yöntem bulunmaktadır.

Enum.GetNames

Parametre olarak bir enum tipi alır. Sonuç olarak aldığı enum tipinin barındığı değerlerin adını içeren bir string dizisi döner.

Aşağıdaki örnek kodda hafta günlerini barındıran DayOfWeek enum yapısı foreach dönülmektedir.

string[] weekdays = Enum.GetNames(typeof(DayOfWeek));

            foreach (string weekday in weekdays)
            {
                Console.WriteLine(weekday);
            }

Enum.GetValues

Bu metot da GetNames metodu gibi bir enum tipi alır. Dönüş değeri olarak da içerisinde aldığı enum tipinin değerlerini barındıran bir dizi (Array) dönderir. Bu Array değerinin elemanları enum’un türüne dönüştürülerek kullanılabilir.

Aşağıdaki kodda örnek bir foreach bulunmaktadır.

            Array weekdays = Enum.GetValues(typeof(DayOfWeek));

            foreach (DayOfWeek weekday in weekdays)
            {
                Console.WriteLine(weekday);
            }

Not: typeof metodu parametre olarak adığı tür adının Type türünden tipini dönderir.




Git Sistemini Güncelleme

Git, versiyon kontrol sistemleri içerisinde en yaygın kullanılan olanıdır. Standart bir arayüz ile kullanılmadığından çoğunlukla güncellemesi ihmal edilen bir sistem oluyor. Aşağıdaki adımlar takip edilerek lokalde kurulu olan git sistemi güncellenebilir.

git --version

kodu ile mevcutta kullanılan git versiyonu tespit edilir.

  • Mevcutta kullanılan versiyon 2.14.1 versiyonundan eski bir versiyon ise mevcut kurulum tamamen kaldırılıp yeni versiyon yüklenir.
  • Mevcutta kullanılan versiyon 2.14.2 ve 2.16.1 versiyonları arasında ise aşağıdaki kod çalıştırılarak güncellenir.

git update

  • Mevcutta kullanılan versiyon 2.16.2 versiyonu ve sonrası ise aşağıdaki kod çalıştırılarak git sistemi güncellenir.

git update-git-for-windows




Android Butona Click Event Atama




C# Extension Metotları Oluşturma




C# İle SQL Server İşlemleri

Yazılım geliştirme çoğunlukla veri saklama ve işleme amacıyla yapılır. Verilerin saklanması içinde bir veritabannı sistemi kullanılır. Videomuzda en çok kullanılan veritabanı sistemlerinden olan SQL Server’a C# ile işlem yapmayı öğreneceğiz.




Instance State Nedir, Ne Zaman Kullanılır?

Konunun içeriğinin daha iyi anlaşılması açısından şöyle bir senaryo üzerinden ilerleyebiliriz:

Örnek ekranımızda bir adet TEXTBOX ve bir adet LABEL var. Butona tıklandığında TEXTBOX değerini alıp LABELe yazdırılıyor. İlk ekranımızda göründüğü gibi “Sait ORHAN” yazısı labele yazdırılmış. Bu durumda iken telefonun yönünü değiştirilmesi durumunda label değeri tasarım aşamasında verilen değere dönüyor. Örneğimizde “HELLO WORLD!” metnine döndüğü gibi ve telefon yönü eski durumuna getirilse bile atanan değer geri gelmiyor.

Bu durumun nedeni Android‘in kullanıcıdan alınan değerleri tutup performansa olumsuz etkisi olmaması için statik değer olduğu farzedilen değerleri hafızaya almamasıdır.

Bu sorunun çözmenin yolu; telefonun yönü değiştiğinde sırası ile onSaveInstanceState ve onRestoreInstanceState olayları tetikleniyor.

onSaveInstanceState metodu içerisinde bu şekilde kaybolan değerler Bundle tipindeki parametreye alınarak koruma altına alınır.

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putString("name", labelName.getText().toString());
    }

onRestoreInstanceState metodu içinde de onSaveInstanceState metodunda kaydedilen değerler alınarak ilgili kontrollere atanır.

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        String name = savedInstanceState.getString("name");
        labelName.setText(name);
    }




Uygulamanın Tek Örneğinin Çalışmasına Müsaade Etmek

Bazı uygulamalar çalışma prensipleri gereği aynı anda tek örneğinin çalışmasına müsaade eder. Uygulama açık iken başka bir örneği çalıştırılmak istendiğinde yukarıdaki gibi uyarı mesajı verip açılacak olan son örneği iptal eder.

Bu işlem için System.Diagnostics sınıfına ait Process sınıfından yararlanılır. Aşağıdaki kod örneğinde görüldüğü gibi öncelikle Process.GetCurrentProcess().ProcessName kod parçası ile başlatılan uygulamanın işlem adı alınıyor. Process.GetProcessesByName metodu ile de bu isme sahip işlemlerin listesi alınıyor. Eğer bu isimde birden fazla işlem var ise uyarı mesajı verilip return komutu ile işlem iptal edilir ve uygulama sonlandırılır.

            Process[] processesByName = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            if (processesByName.Length > 1)
            {
                MessageBox.Show("Uygulama zaten çalışıyor.");
                return;
            }

Kodu uygulamanızın Main metodunun içinde başlangıç formunu ekrana göstermeden önce kullanabilirsiniz. Bu şekilde kullanmanız durumunda Main metodunuz aşağıdaki gibi olacaktır.

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Process[] processesByName = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            if (processesByName.Length > 1)
            {
                MessageBox.Show("Uygulama zaten çalışıyor.");
                return;
            }

            Application.Run(new Form1());
        }




C# String Değerden Diğer Veri Türlerine Çeviri

C# dilinin klavyeden girilen varsayılan veri tipi string türüdür. Alınan verinin kullanım yerine göre özellikle sayı türüne çevrilmesi gerekmektedir. Bu işlem yapılırken temel olarak üç yöntemden biri kullanılabilir. Bu yöntemler aşağıdaki gibidir:

  • Convert sınıfının ilgili metotlarından birini kullanmak
  • Hedef sınıfın Parse adlı metodunu kullanmak
  • Hedef sınıfın TryParse adlı metodunu kullanmak

Convert sınıfının ilgili metotları “To” ile başlayan ve hedef türün adı ile biten metotlardır. ToInt16, ToInt32, ToDouble vb…

İlk örneğimizi Convert sınıfı ile verelim:

string metin = textBoxNumber.Text;
if (metin.Any(c => !Char.IsDigit(c)))
{
    MessageBox.Show("Hatalı giriş");
    return;
}
int sayi = Convert.ToInt32(metin);

Bu örneğimizde if şartının içinde yer alan şartta girilen metnin sadece rakamlardan oluşup oluşmadığı test ediliyor. Rakam dışında bir karakter barındıran bir metin geldi ise “Hatalı giriş” uyarısını verip işlem return oluyor.

Aynı işlemi Parse metodu ile yapacak olursak kodu aşağıdaki gibi değiştirmemiz gerekmektedir.

            string metin = textBoxNumber.Text;

            if (metin.Any(c => !Char.IsDigit(c)))
            {
                MessageBox.Show("Hatalı giriş");
                return;
            }

            int sayi = Int32.Parse(metin);

Parse metodunun kullanımı da Convert sınıfının ToXXX metotlarının kullanımı ile aynıdır.

string to int çeviri işleminde kullanılan bir diğer metot da TryParse metodudur. Bu metodun kullanımı sırasında gelen metnin sadece rakamlardan oluşup oluşmadığını test etmeye gerek yoktur. Çalışma şeklini örnek kod üzerinden inceleyelim:

            string metin = textBoxNumber.Text;
            int sayi;

            bool tryParse = Int32.TryParse(metin, out sayi);
            if (tryParse)
            {
                MessageBox.Show("Doğru format");
            }
            else
            {
                MessageBox.Show("Yanlış format");
            }

TryParse metodunun geri dönüş tipi diğerlerinin aksine bool veri tipidir. Çalışma şekli de aşağıdaki adımlardan oluşmaktadır.

  1. Hedef veri türünde bir tanımla yapılır. (Satır 2)
  2. İlgili türün TryParse metodu çağrılır. İlk parametreye dönüştürülecek kaynak metin, ikinci parametreye de daha önce oluşturulan hedef türün örneği out parametresi ile verilir. (Satır 4)
  3. Bu metot çağırma sonucunda dönüşüm işlemi başarılı olursa hedef türün örneğine dönüşüm sonucu atanır, metot dönüş değeri de true olur. Dönüşümün başarısız olması durumunda ise hedef türün örneğine ilgili sınıfın varsayılan değeri atanır, metot dönüş değeri de false olur. Böylelikle işlemin sonucu bir if yardımı ile sorgulanmış olur.




Nesnelerin SQL Server Üzerinde Kullandığı RAM Miktarını Bulma

SQL Server üzerinde yer alan veritabanı ve diğer nesnelerin ne kadar sistem kaynağı tükettiğini bulmak için aşağıdaki iki temel sorguyu kullanabiliriz.

İlk sorgumuzda veritablanı bazında kullanılan RAM miktarını sorgulayabiliriz.

SELECT
[DatabaseName] = CASE [database_id] WHEN 32767
THEN 'Resource DB'
ELSE DB_NAME([database_id]) END,
COUNT_BIG(*) [Pages in Buffer],
COUNT_BIG(*)/128 [Buffer Size in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY [database_id]
ORDER BY [Pages in Buffer] DESC;

Veritabanı Kullanılan RAM Sorgusu

Diğer sorgumuzda ise Index ve benzeri diğer nesnelerin kullandığı RAM miktarını sorgulayabiliriz.

SELECT obj.name [Object Name], o.type_desc [Object Type],
i.name [Index Name], i.type_desc [Index Type],
COUNT(*) AS [Cached Pages Count],
COUNT(*)/128 AS [Cached Pages In MB]
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN
(
SELECT object_name(object_id) AS name, object_id
,index_id ,allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.type = 1 OR au.type = 3)
UNION ALL
SELECT object_name(object_id) AS name, object_id
,index_id, allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.type = 2
) AS obj
ON bd.allocation_unit_id = obj.allocation_unit_id
INNER JOIN sys.indexes i ON obj.[object_id] = i.[object_id]
INNER JOIN sys.objects o ON obj.[object_id] = o.[object_id]
WHERE database_id = DB_ID()
GROUP BY obj.name, i.type_desc, o.type_desc,i.name
ORDER BY [Cached Pages In MB] DESC;

Nesnelerin Kullandığı RAM Miktarı




Server Management Objects (SMO) İle SQL Server Kontrolü

Server Management Objects, .Net framework kullanarak SQL Server‘ı bütün yönleri ile yönetebileceğiniz yazılımlar geliştirmenizi sağlayan bir kütüphanedir. Örneğin aşağıdaki kod parçası ile sunucu üzerinde kolayca bir veritabanı oluşturuyoruz.

SMO kütüphanesini kullanabilmek için öncelikle Nuget üzerinden Microsoft.SqlServer.SqlManagementObjects projemize referans olarak eklememiz gerekmektedir.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database database = new Database(server, "Smo");
database.Create();

Bu kod ile sınıcı üzerinde Smo adında bir veritabanı oluşur.

Şimdi de başka bir işlem olan tablo oluşturma işlemi yapalım.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database workDatabase = server.Databases["Smo"];

Table table = new Table(workDatabase, "People");

Column idColumn = new Column(table, "Id", DataType.Int);
idColumn.Identity = true;
table.Columns.Add(idColumn);

Column nameColumn = new Column(table, "Name", DataType.NVarChar(50));
nameColumn.Nullable = false;
table.Columns.Add(nameColumn);

table.Create();

Bu kod ile server nesnesi üzerinde Smo veritabanını seçtikten sonra bu veritabanını parametre olarak verdiğimiz Tablo tipinde bir table nesnesi oluşturuyoruz. Daha sonra bu table nasnesini parametre olarak verdiğimiz ilgili kolonları oluşturup table.Create() ile veritabanını oluşturuyoruz.

Server Management Objects ile diğer işlemleri aşağıdaki videoda inceleyebilirsiniz

SMO İncelemesi

SMO video kodları:

https://github.com/saitorhan/ServerManagementObjects