C#

C# ile SemaphoreSlim Kullanımı

Uzun ama çok uzun bir aradan sonra tekrardan yazı girmenin heyecanı ile bu satırlara başlıyorum 🙂 En son ki yazımın neredeyse senesi geliyordu, bu arada askerlik, sivil hayata adaptasyon, yeni iş derken bu zamana kadar sarktı. Umarım bir daha bu kadar ara vermem (her blog sahibinin tek temennisi ve sadece %10’u bu temenniyi gerçeğe dönüştürüyor 🙂 )

Konu başlığımı seçerken gerçek hayatta yeni öğrendiğim şeylerin payı büyüktür. Bende geçtiğimiz ay yeni öğrendiğim ve bir uygulamada kullanma fırsatı bulduğum SemaphoreSlim sınıfından bahsedeceğim.

Devamını Oku

Multithread Uygulamalarda Değişken Kullanımı

Yaklaşık 3 aydır “Sobee Studios” firmasında çalışıyorum ve açık söylemek gerekirse bu kadar kısa sürede bir çok şey öğrendim. Teşekkürü sonda yapılmasını pek doğru bulmadığım için başında yapayım, bu 3 aylık süreçte deneyimlerini benimle paylaşan Cem Sermen ve Fatih Güngör‘e çok teşekkür ediyorum. Ayrıca uzun zamandır yazmadığım için de baya bir konu birikti, en kısa sürede bunları burada paylaşacağımı söyleyip konuya gireyim.

Bir çok uygulamada özellikle Client-Server uygulamalarında ram’de geçici olarak veri tutmanız gerekebilir. Bu verileri bir değişkende (int, bool, long vs.) tutabileceğiniz gibi birden fazla olması durumunda dizilerde de tutabilirsiniz. SingleThread bir uygulama da diziye veri eklemek ve çıkartmak sizin için problem olmayacaktır çünkü o diziye sadece tek bir thread’den tek bir uygulama erişecektir. Sorun multithread uygulamalar da ortaya çıkıyor. 

Resim üzerinden gidecek olursak, Thread-1 diziye bir veri elemanı eklemek için erişiyor olsun. Aynı şekilde Thread-2’de diziden veri okumak için erişiyor olduğunu düşünelim. Önce hangi işlem yapılacak? Okuma işlemi mi? Yoksa yazma işlemi mi? Yada Thread-1 veri’deki bir elemanı değiştiriyor olsun, Thread-2’nin okumaya çalıştığı veri elemanının güncel olmasını garanti edebilir miyiz?

Devamını Oku

Visual Studio 2010 ile Unit Test

Hemen hemen hepimizin başına gelmiştir; fonksiyonda ufak bir değişlik yaparız sonrasında ona bağlı bazı fonksiyonlar çalışmaz hale gelir. Bunu ya Tester’lar fark eder ya da son kullanıcılardan gelen bildirimlerden anlarız. Geçtiğimiz günlerde, varlığını daha önce duyduğum ama kullanmadığım bir teknolojiyi anlatacağım; “Unit Test”. Visual Studio 2010 ile birlikte gelen yeniliklerden bir tanesi olan “Unit Test” bize büyük bir kolaylık sağlıyor.Tester’lara gitmeden önce kendimiz çok hızlı ve kolay bir şekilde Test fonksiyonlarımızı hazırlayıp kendimiz test edebiliyoruz. Böylece fonksiyonlarımızda bir değişiklik yaptığımızda aklımızda “acaba başka bir yer bozuldu mu?” gibi endişeler taşımıyoruz.

Devamını Oku

Programımıza Help Dosyası Ekleme!

Neredeyse bütün yazılımlarda bir “Yardım” dosyası vardır. Bu dosyaların formatı genelde .chm formatında olurlar. .chm formatı hakkında ayrıntılı bilgi için buraya tıklayabilirsiniz. Kısaca açıklamak gerekirse sıkıştırılmış html dosyalarıdır. Peki biz yaptığımız programda nasıl bu .chm dosyasını göstereceğiz? Elbetteki .Net kütüphanesi sayesinde tek satırda :).

Aşağıdaki kodu yazdığınızda .chm dosyasını programda açıldığını göreceksiniz.

Help.ShowHelp(this, "help.chm);

Görüldüğü gibi tek satır kod ile help.chm isimli dosyamızı programımızda gösterebildik. Başlığa bakarsak makaleyi burada bitirebiliriz ama gelin isterseniz şu Help sınıfını biraz inceleyelim.

Help statik sınıfının 4 tane “overload” edilmiş fonksiyonu var. Bunlar;

1. ShowHelp(Control, String)
2. ShowHelp(Control, String, String)
3. ShowHelp(Control, String, HelpNavigator)
4. ShowHelp(Control, String, HelpNavigator, Object)


1. fonksiyonu yukarıda kullandığımız şekilde sadece .chm dosyamızı göstermek için kullanabiliriz. İlk parametre yardım dosyasının hangi “parent” altında gösterileceğini söylüyor. İkinci parametre ise .chm dosyasının yolu. Bu iki parametre tüm fonksiyonlarda aynı.

2. fonksiyondaki son parametre ise sizden “anahtar kelime” istiyor. Yani siz diyelimki belli bir konu üzerinde araştırma yapacaksınız o zaman buraya hangi konuda araştırma yapacaksanız onu belirtmeniz gerekiyor.

3. fonksiyondaki son parametre ise HelpNavigator türünden bir enum. Bu enumdaki değerler ise; TableOfContents, Find, Index, ve Topic. Örnek vermek gerekirse Find kısmını parametre olarak geçerseniz “Yardım” dosyanız “Arama” modunda açılacaktır.

4. fonksiyondaki son parametre ise 2. fonksiyondaki String ile aynı anlamı taşıyor tek farkı bu parametreye geçeceğiniz değeri HelpNavigator‘e göre ayarlamanız. Örnek vermek gerekirse; siz HelpNavigator.Topic dediyseniz son parametreye aranacak başlığı geçebilirsiniz.

Bu makalede Help statik sınıfını kullanarak nasıl bir .chm dosyasını gösterebileceğimizi ve o dosyadan işlemler yapabileceğimizi görmüş olduk. Bir sonraki makalede (C# ile Web Service Hazırlama ve Kullanımı) görüşmek üzere…

C# ile Dosyadan Okuma-Yazma İşlemleri!

Finaller, Fuarlar, MSP başvuru videosu derken blogumu yeteri kadar boşladım. (Eğer bu haftada birşeyler yazmasaydım kapatacaktım blogumu :)). Admin paneline girerken tedirgindim ama şifresini hatırlayınca içim rahatladı :).

Yazacağım makalelerin konusunu daha çok forumlardan belirliyorum. Forumlarda en çok hangi konularda problemler ile karşılaşılıyorsa onunla ilgili birşeyler yazmayı tercih ediyorum. Dosyadan okuma yazma işlemleri ile ilgili sorular soruluyordu bende bununla alakalı bir makale yazmak istedim. Umarım faydalı olur…

Dosyadan okuma yazma yapmak için bir tane FileStream türünden nesneye ihtiyacınız olacak.

Örnek olarak; FileStream fs = new FileStream(@”C:\dosya.txt”, FileMode.Create, FileAccess.Read);

İlk parametre hangi dosyadan okuma yapacaksanız veya yazma yapacaksanız dosya yolunu, ikinci parametre ise FileMode türünden bir enum. Bu enum türünden dosyayı ne modda üreteceğinizi veya erişeceğinizi belirtiyorsunuz. FileMode‘da şu değerler var;

FileMode.Append: Eğer dosya başka bir program tarafından kullanılıyorsa veya açıksa
yazacağınız karakterler dosyanın sonuna eklenecek.
FileMode.Create: Belirttiğiniz dosya isminde bir dosya yoksa üretecek, eğer varsa üstüne
yazacak.
FileMode.CreateNew: Dosya olsada olmasada yeni bir tane üretecek.
FileMode.Open: Belirtilen dosyayı açacak. Bu durumda dosyanın kapalı olması lazım
aksi takdirde Exception alabilirsiniz.
FileMode.OpenorCreate: Eğer dosya varsa açacak, yoksa yeni bir tane üretecek.
FileMode.Truncate: Bu modda dosyanın mutlaka açık olması lazım, açık olan dosyanın içindeki
bilgileri siliyor.

FileStream sınıfının üretici fonksiyonun üçüncü parametresi ise, FileAccess türünden bir enum ile dosyaya erişim modunu istiyor. FileAccess’de eğer okuma yapacaksanız .Read, yazma yapacaksanız .Write, hem okuma hem de yazma yapacaksanız .ReadWrite. FileStream’ı tanımladıktan sonra işimiz artık daha da kolay. Bu sınıfın bize sağladı fs.Read(…) ve fs.Write(…) fonksiyonları ile dosyadan veri okuma ve veri yazma yapabiliriz. Şimdi “…” bunları biraz açalım. Önce okuma fonksiyonundan başlayalım;

int [Okunan Byte Sayısı] fs.Read(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyadan okuduğunuz verileri bu byte dizisinde olacak, ikinci parametre ise dosyadaki verileri bu dizinin kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise kaç karakter okunacağını istiyor. Geri dönüş değeri ise dosyadan kaç karakter okuduğunuz.

void fs.Write(byte[] dizi, int Indis, int Yazılacak Byte Sayısı): İlk parametre bir byte dizisi dosyaya yazacağınız veriler bu byte dizisinde olacak, ikinci parametre ise dizideki verileri kaçıncı indisinden itibaren yazacağınızı, üçüncü parametre de ise belirtiğiniz indisten itibaren kaç karakter yazacağınızı istiyor.

Dikkatini çektiyse burada hiç string türünden birşey yok, yani siz dosyaya “Deneme yazısı” yazmak istediğinizde bunu bir byte dizisine atmanız gerekiyor. Elbette bu string türünden ifadeyi direk dosyaya yazan bir fonksiyon var ama biz gelin önce bu string’i byte dizisine çevirelim sonra da dosyaya yazalım;

FileStream fs = new FileStream(@"C:\dosya.txt", FileMode.Create, FileAccess.Read);
byte[] dosyaYazisi = ASCIIEncoding.ASCII.GetBytes("Deneme yazısı");
fs.Write(dosyaYazisi, 0, dosyaYazisi.Length);

Evet hepsi bu kadar ama her seferinde yazacağınız veriyi ASCIIEnco…. sınıfında byte’a dönüştürüp sonra yazmak zor olsa gerek. Gelin bunu biz .Write(“Deneme yazısı”) şeklinde yapalım. .Net kütüphanesinde birden fazla okuma ve yazma yapan sınıflar var; StreamWriter, BinaryWriter, StreamReader, BinaryReader gibi sınıflar bu konuda imdadımıza yetişiyor. Bu sınıfların hepsi FileStream türünden bir nesne istiyor, buradan da şunu anlıyoruz biz dosyadan okuma yazma yapacaksak hemen bir tane FileStream tanımlayacağınız. StreamReader ve StreamWriter sınıflarını burada anlatacağım Binary versiyonunu size bırakıyorum :),

StreamWriter sw = new StreamWriter(fs); bu şekilde tanımlama yaptığınız takdirde StreamWriter nesnesini, FileStream türünden tanımladığınız nesnenin tüm özellikleri ile erişebilirsiniz. StreamWriter adından da anlaşılacağı gibi dosyaya yazma yapan bir fonksiyon ve bunun için iki tane kullanışlı fonksiyonu var; .Write(…), .WriteLine(…), WriteLine dediğiniz takdirde “sw.NewLine” özelliğine belirtiğiniz karakteri sonuna ekler. (Hiçbirşey belirtmezseniz ‘\n’ vardır. Yani alt satıra geçer 😉 ).

.Write(…) fonksiyonu neredeyse bütün veri türlerini kabul ediyor ve dosyaya yazıyor. Bu fonksiyonu Console.Write(…) fonksiyonun aynısı olarak düşünebilirsiniz.

StreamReader sınıfını ise tahmin edeceğiniz gibi; StreamReader sr = new StreamReader(fs) şeklinde tanımlıyoruz. StreamReader’da bize dosyadan verileri okumakta yardımcı olan bir sınıf ve kullanışlı olan birkaç .Read fonksiyonu var; .Read(…), .ReadLine(…), .ReadToEnd(…).

.Read(…): Bu fonksiyonun iki türü var eğer .Read() olarak kullanırsanız size int türünden bir değer dönecektir. İkinci türü ise FileStream sınıfındaki .Read(…) ile aynı.

.ReadLine(…): Bu fonksiyon dosyadan sadece tek bir satır okur. Eğer satır satır okuma yapacaksanız bu fonksiyonu kullanabilirsiniz.

.ReadToEnd(…): Bu fonksiyon dosyanın başından sonuna kadar okur ve bunu bir string türünden geri döndürür.

Son olarak şunu da belirtmek istiyorum; FileStream sınıfının önemli bir fonksiyonuda .Seek(…) bu fonksiyonu kullanarak dosya imlecini istediğiniz yere set edebilirsiniz. Kullanımı ise fs.Seek(3, SeekOrigin.Begin) böyle dedikten sonra okuma yaparsanız eğer size (“eme Yazısı”) dönecektir.

Gördüğünüz gibi dosyadan okuma ve yazma işlemi .Net ile çok kolay. Umarım buradaki bilgiler sizlere faydalı olur,

Görüşmek üzere,

Hepinize kolay gelsin, iyi çalışmalar…

Sipariş Takip Formu!

Merhabalar,

Uzun zamandır siteme makale giremiyorum Haziran ayında tekrardan ‘Ayın Konusu’ konseptini başlatacağım yoksa siteye makale gireceğim. Haziran ayına kadar en az 3 makale ekleme hedefim var ama bakalım…

Arkadaşlar bir firma için yaptığım “Sipariş Takip” programının kaynak kodlarını sizlerle paylaşıyorum. (Tabiki firmanın haberi var :)) Programda eksikler, hatalar olabilir pek fazla geri bildirim alamadım. Programda yazıcı kontrolü, access veritabanı bağlantısı, stored procedure ve datagridview gibi kontrollerin kullanımı için fikir verebilir. Umarım sizler için faydalı olur.

Programın Kaynak Kodu için buraya, program için buraya tıklayınız.

Programdan resimler;

C# Serial Port Bileşeni!

Siteme her gün bir makale eklemek istiyorum ama bir şekilde ne oluyorsa ekleyemiyorum. Okul beklediğimden de çok vaktimi aldı üstüne birde çalıştığım firmanın projeleri, okuldaki kulüp etkinlikleri derken bu zamana kadar makale ekleme fırsatım olmadı. Forumlarda gezindiğimde seri port ile ilgili birçok arkadaşın sıkıntısı oluyordu bende C#’ın ‘Serial Port’ bileşeni ile ilgili bir makale yazmak istedim. Şimdi bu bileşeni inceleyelim;

Yaptığımız yazılımlar bazen bir cihazla haberleşmek durumda kalabilir. Örnek olarak, bilgisayardan kontrol edebileceğiniz bir robot olabilir, ısı değeri okuyabileceğiniz bir sistem olabilir, kısacası bir sistemi bilgisayarınızdan kontrol etmek istiyorsanız serial port bileşeni sizin imdadınıza yetişiyor. Şimdi gelin bu sınıfın bazı faydalı fonksiyonlarını, olaylarını ve özelliklerini inceleyelim;

serialPort.BaudRate: SerialPort sınıfının BaudRate isimli özelliği bilgisayardan kontrol edeceğiniz sistem ile haberleşme esnasında ki veri iletişimi hızı. Bu özellik sistemden sisteme değişiklik göstermektedir. BaudRate için şunu söyleyebiliriz saniye gönderilen bit sayısı, eğer sisteminizle iletişim hızınız 9600 ise bilgisayarın seri portundan saniyede 9600 bit veri gönderip alabilirsiniz demektir. Bu yüzden eğer sisteminiz 19200 ise ve siz bilgisayar programından bu özelliği set etmez iseniz verileri sağlıklı bir şekilde gönderip alamayacaksınız çünkü bu özelliğin default değeri 9600.

serialPort.IsOpen: SerialPort sınıfının IsOpen isimli özelliği seri portun açık olup olmadığını bool türünden söyleyen bir özellik. Portu kullanmadan önce mutlaka açık olup olmadığını kontrol etmenizde fayda var eğer portu kullandıktan sonra kapatmadan tekrar açmaya çalışırsanız programınız hata verecektir.

serialPort.PortName: SerialPort sınıfının PortName isimli özelliği seri portunuzun ismini isteyecektir. Eğer bir çevirici kullanmadan direk seri porta bağladıysanız ‘COM1’, bir çevirici aracılığıyla ismini değişti ise ‘COM5’, ‘COM6’ vb. string türünden port isminizi girebilirsiniz.

serialPort.ReadTimeout: SerialPort sınıfının ReadTimeout isimli özelliği seri portun cihazdan kaç saniye boyunca cevap beklemesini istiyorsanız onu int türünden mili saniye cinsinden girmeniz gerekiyor. Eğer istediğiniz cihazdan 3 saniye boyunca cevap gelmez ise hata vermesi ise buraya serialPort.ReadTimeout = 3000 demeniz gerekiyor.

serialPort.WriteTimeout: SerialPort sınıfının WriteTimeout isimli özelliği ise seri portunuzun yazma işlemini kaç saniye boyunca sürdürmesini istiyorsanız yine int türünden mili saniye cinsinden bu özelliği set etmeniz gerekmektedir.

Serial Port sınıfının önemli bir kaç özelliğini inceledikten sonra şimdide bir kaç tane fonksiyonlarını inceleyelim.

serialPort.DiscardInBuffer(): SerialPort sınıfının DiscardInBuffer isimli fonksiyonu seri portunuzun bufferını temizlemek için kullanılan geri dönüş değeri ve parametresi olmayan fonksiyondur. Çok sık veri alış-verişi yaptığınız sistemlerde kullanmanız gereken bir fonksiyondur. Bazen haberleşme esnasında kullanmadığınız ama portda kalan verileriniz olabilir böyle bir durumda ikinci kez veri okumaya kalktığınız da hem o önceki okumada kalan verileri hem de cihazdan gelen doğru cevabı alırsınız. Bundan dolayıda doğru veri ile işlem yapmamış olursunuz.

serialPort.DiscardOutBuffer(): SerialPort sınıfının DiscardOutBuffer isimli fonksiyonu seri portunuzun veri gönderme aşamasındaki verileri temizlemek için kullanmanız gereken geri dönüş değeri ve parametresi olmayan fonksiyonudur.

serialPort.GetPortNames(): SerialPort sınıfının static GetPortNames isimli fonksiyonu bilgisayarınızdaki kullanılabilir portların isimlerini size string dizisi şeklinde söyleyen fonksiyondur. Eğer kullanıcınıza açık olan portları söylemek istiyorsanız bu fonksiyonu kullanabilirsiniz. Şöyle ki; formunuzda bir comboBox olduğunu düşünün ve bu comboBox’ın içini kullanılabilir portların isimleri ile doldurmak istiyorsanız. Bunun için iki yol;

Birinci Yol;

for (int i = 0; i < 30; i++)
{
   try
   {
      serialport.PortName = "COM" + i.ToString();
      serialport.Open();
      comNo_cb.Items.Add(serialport.PortName);
      serialport.Close();
   }
   catch (Exception)
   { continue; }
}

En fazla 30 tane port olduğunu düşünürüz ve bu portları tek tek açıp kapatırız, eğer sorunsuz bir şekilde açılırsa demek ki bu port kullanılabilir deriz ve hemen comboBox’a ismini yazarız. Birde bunu GetPortNames ile yapalım;

comNo_cb.Items.Add(SerialPort.GetPortNames());

2. yol hepimiz için daha hayırlı bir yol gibi duruyor :).

serialPort.Open(): SerialPort sınıfının Open isimli fonksiyonu seri portunuzu açmanıza yarar. Hemen şunu söylemekte fayda var bu işlemi yapmadan önce bir hata almak istemiyorsanız port adını, baudRate’inizi belirtmeyi unutmayın. Eğer port adını belirtmez iseniz veya yanlış yazarsanız hata alacaksınız.

serialPort.Read(byte[] buffer, int offset, int count): SerialPort sınıfının Read isimli fonksiyonu seri portunuzdan veri okumanızı sağlayan bir fonksiyondur. İlk parametresi byte türünden bir dizi, ikinci parametre dizinin kaçıncı indisinden itibaren veri yerleştireceğini, son parametresine ise kaç byte veri okuyacağınızı söylemeniz gerekiyor. İlk parametre char türünden bir dizide olabilir. Fonksiyonun geri dönüş değeri ise kaç byte okunduysa onu size int türünden söyler.

serialPort.ReadByte(): SerialPort sınıfının ReadByte isimli fonksiyonu seri portdan sadece bir byte okumanızı sağlayan fonksiyon. İsmi ReadByte olmasına rağmen geri dönüş değeri int türüdür ve size okunan değeri söyler.

serialPort.ReadExisting(): SerialPort sınıfının ReadExisting isimli fonksiyonu çağrıldığı zaman seri portdan okunabilen tüm veriyi size string türünden geri döndürür.

serialPort.ReadLine(): SerialPort sınıfının ReadLine isimli fonksiyonu seri portdan NewLine karakteri gelene kadar tanımladığınız ReadTimeout süresince bekler. Gelen veriyi size string türünden geri döndürür.

serialPort.Write(): SerialPort sınıfının Write isimli fonksiyonunun 3 tipi var bunlardan biri cihaza göndermek istediğiniz veriyi string türünden göndermenizi sağlıyor;

serialPort.Write("Bu veriyi cihaza yaz");

İkinci yöntem ise veriyi byte dizisi türünden göndermenizi sağlıyor.

byte[] gidecekVeri = new byte[] {0x30, 0x31, 0x32, 0x33, 0x34};
serialPort.Write(gidecekVeri, 0, gidecekVeri.Length);

Tahmin edeceğiniz gibi ilk parametre byte türünden bir dizi, ikinci parametre ise bu dizinin kaçıncı indisinden itibaren üçüncü parametredeki değer kadar seri portdan veri göndermenizi istiyor. Birde byte dizisinin yerine char dizisi ile gönderebileceğiniz üçüncü bir tipi bulunuyor.

serialPort.WriteLine(): SerialPort sınıfının Write isimli fonksiyonu göndermek istediğiniz veriyi string türünden parametre geçerek gönderebilirsiniz. Write fonksiyonundan tek farkı göndermek istediğiniz verinin sonuna ‘\n’ karakterini ekliyor olması.

Genel olarak serialPort sınıfının fonksiyonlarını ve özelliklerini inceledik, en kısa zamanda bununla ilgili bir uygulama yapıp siteme koymayı düşünüyorum.Seriport ile uğraşan arkadaşlar için umarım faydalı olmuştur.

Görüşmek üzere, iyi çalışmalar…

C# ile Output Parametreli Stored Procedure Çalıştırmak!

Arkadaşlar önceki makalelerimde C# ile stored procedure nasıl kullanıldığından bahsetmiştik. Bu makalede ise eğer stored procedure’de output veriye sahip bir parametre değişkenimiz varsa nasıl kullanacağımızdan bahsedeceğiz.

Aşağıdaki gibi bir stored proceduremuz olduğunu düşünelim;

create proc [dbo].[up_SifreOlustur]
@RandomID char(32) OUTPUT
as
begin
//--
end

 

Görüldüğü gibi Stored Procedure OUTPUT parametreli bir değişken alıyor bunun anlamı şu ‘Stored Procedure’ çalıştırıldıktan sonra @RandomID isimli değişkene bir değer yazılacak. Bunu C# programımızda kullanmak için ise aşağıdaki gibi bir yöntem izleyeceğiz;

SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "[up_Sifre]";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@RandomID", SqlDbType.Char, 32);
cmd.Parameters["@RandomID"].Direction = ParameterDirection.Output;
try
{
 cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
 MessageBox.Show(ex.Message);
 return;
}
tekKullanimlikSifre_tb.Text = (string)cmd.Parameters["@RandomID"].Value;

 

Kodumuzu inceleyecek olursak C# ile normalde nasıl stored procedure çalıştırıyorsak yine aynı şekilde çalıştırıyoruz fakat tek fark şu; cmd.Parameters.Add(“@RandomID”, SqlDbType.VarChar, 32); burada normalde .AddWithValue(…) deyip parametremizi geçiyorduk bu sefer .Add(…) kullanarak parametreyi geçiyoruz. Fonksiyonu inceleyecek olursak ilk parametre Stored Procedure’un istediği değişken ismi, 2. parametre ise değişkenin türü, 3. parametre ise değişkenin uzunluğu (int türü bir değişken olsaydı son parametreyi kullanmayacaktık). cmd.Parameters[“@RandomID”].Direction = ParameterDirection.Output; bu kısmı bu zamana kadar açıkcası bende bilmiyordum araştırdığımda ne anlama geldiğini öğrendim. Parameters dizisinin “@RandomID” parametresini OUTPUT yapmak için kullanılıyor. Bu işlemi yaptıktan sonra gönül rahatlığı ile Stored Procedure çalıştırılabilir. Son olarak işlem bittikten sonra değeri okumak için; cmd.Parameters[“@RandomID”].Value; kısmından değerimizi okuyabiliriz. object türünden olduğu için tür dönüşümü operatörünü kullanmak gerekiyor.

Umarım sizler için faydalı olmuştur, yeni bir makalede görüşmek üzere…

Herkese kolay gelsin, iyi çalışmalar…

Tab Order!

Uzun bir aradan sonra tekrar merhaba arkadaşlar. Bu makalede Visual Studio IDE’sinde programlarımızın kontrollerini nasıl sıraya dizeceğimizi öğreneceğiz. Birçok programda Tab tuşuna bastığınız zaman bir sonraki kontrolü seçer, peki biz bunu kendi programımıza nasıl uygulayabiliriz?

Normal de biz hiçbirşey yapmazsak kontroller form’a ekleniş sırasına göre dizilmiş olur. Ilk önce bir ‘Textbox’ eklediyseniz ver ardından bir ‘Combobox’ eklediyseniz ‘Textbox’ın içindeyken Tab tuşuna basarsanız Combobox’ı seçer. Birçok kontrolün bulunduğu programlarda bu işlem önem arz ediyor. Kullanıcı Tab tuşuna bastığı zaman imleç’i bir sonraki kontrolde görmek istiyor. Şimdi gelin bu işlemin nasıl yapıldığını inceleyelim;

tab_order_btn

Visual Studio idesinde yukarıdaki butona bastığınız zaman formunuzdaki kontrollerin sol  üst köşesinde aşağıdaki gibi bir rakamlar belirecek;

resim1

Bu rakamlar Tab tuşuna basıldığında hangi kontrollerin sırasıyla seçileceğini gösteriyor. Kontrollerin üzerine tıklayarak sıralama işlemini yapabilirsiniz. Tüm kontrollerin sıralama işlemi bittiğinde aşağıdaki gibi otomatik olarak hepsi mavi renk olacaktır;

resim2

Tekrar Tab Order butonuna bastığınızda rakamlar gözükmeyecektir. Artık sizde programınızın kontrollerini sıraya dizmiş olduğunuz. Tab tuşuna bastığınız zaman imleç farklı farklı yerlere gitmeyecek.

Umarım faydalı olmuştur,

Herkese kolay gelsin, iyi çalışmalar…

Ayın Konusu: AES Şifreleme Algoritması ile Veri Şifreleme ve Çözümleme!

Kriptoloji geçmişten günümüze kadar kadar kullanılan bir şifreleme bilimidir ve veri iletişiminin güvenliğini matematiksel fonksiyonlarla sağlamaktadır. Günümüzde çeşitli şifreleme algoritmaları mevcutdur; MD5, SHA1, RSA, RC4, AES gibi çeşitli şifreleme algoritmaları mevcuttur. Biz bu makalede AES algoritmasını inceleyeceğiz. .NET Kütüphanesinden bulabileceğiniz bu algoritmaya ben kendim internetten bulduğum C kodunu C# koduna çevirerek sizlere vereceğim. Yaptığım AES sınıfının kullanımına bakalım şimdi;

2 Temel fonksiyonumuz var; decrypt() ve encrypt(). Sınıfın kullanımına örnek kod bloğu;

int[] sifrelenecekData = new int[16];
int[] aes_key = new int[16];

aes.block = sifrelenecekData;
aes.key = aes_key
aes.encrypt(); // Artık aes.block'da şifreli data var...
aes.key = aes_key
aes.decrypt(); // aes.block'da ilk data var...

Yukarıdaki kod parçacığını örneklendirecek olursak, biz veritabanımızdaki verileri AES 128-bit algoritması ile şifrelemek isteyelim. Bizim önce şifreleyeceğimiz veriyi aes.block dizisine yüklememiz lazım. Ardından da her iki tarafında bilmesi gereken bir ‘KEY’ olması lazım. Bu key sizin güvenliğinizi sağlayacaktır. Verinizi bu ‘KEY’ ile şifreledikten sonra veritabanınıza kaydettiğinizi düşünün. Eğer dışarıdan biri veritabanınıza erişse bile veriler şifreli olduğu için ve ‘KEY’i bilmediğinden veritabanında ki datalar onun için hiçbirşey ifade etmeyecektir. Sizin kullanıcılarınız ‘KEY’i bildikleri için veritabanındaki veriler kullanıcılarınız için anlamlı hale gelecekdir.Şifrelediğiniz bu veriyi açmak için yine ‘AES’ sınıfının ‘BLOCK’ dizisine datayı yükleyiniz ve ardından da aes.key dizisine belirlediğiniz gizli ‘KEY’i yükleyin ve aes.decrypt() fonksiyonunu çağırın. Artık aes.block dizisinde şifrelediğiniz veri var.

Bu sınıfı için indirmek için buraya tıklayabilir ya da ‘Download’ bölümünden indirebilirsiniz.

Kriptoloji ile ileride .NET Kütüphanesinin System.Security isim alanını ileriki aylarda detaylı bir şekilde inceleğiz. Kriptoloji için güzel bir giriş yaptığımızı düşünüyorum umarım sizler için faydalı olmuştur. Bu ayın son konusu buydu arkadaşlar…

Hepinize kolay gelsin, iyi çalışmalar…

1 2 3  Scroll to top