Mirosoft Visual C++ .Net ve mySQL..!!

  • Konbuyu başlatan |St_AnGeR|
  • Başlangıç tarihi
S

|St_AnGeR|

Guest
Bu yazıda Mono projesi bünyesinde C# ile sıfırdan yazılmış yerel mySQL sürücülerini C++.NET aracılığı ile ihtiyacımız olduğunda nasıl kullanabileceğimizi görücez.

Öncelikli olarak mySQL 'e erişim konusunda ihtiyacımız olabilecek araçları nerden sağlayabiliriz.
( İlgili adreslerden indiriceğiniz tüm uygulamalar GPL lisansı altındadır ve ücretsizdir. )

mySQL: http://dev.mysql.com/downloads/
mySQL Administrator: http://dev.mysql.com/downloads/administrator/
mySQL Editor: http://www.mysqlfront.de/download.html
mySQL ADO.NET Sürücüleri: http://www.go-mono.com/mysql.html

Yeni bir proje başlattıkdan sonra ByteFX.MySqlClient.dll 'i referans olarak eklemeliyiz. mySQL ADO.NET sürücüleri kurulumunu gerçekleştirdiyseniz bu assembly dosyaları kütüphaneler arasında gözükücektir.

add_ref_mysql1.JPG


mySQL kütüphanelerini projemize referans olarak ekledikten sonra mySQL'e erişiceğimiz kod içerisine aşağıdaki belirtiyi ekleriz

Kod:
using namespace ByteFX::Data::MySqlClient;

Form veya webservisleri için veritabanındaki bilgiye ulaşmanın iki yoluna değinicez. Bunlardan biri klasik çektiğimiz verileri satır satır işlemek bir diğeri ise DataSet sınıfını kullanarak işleri biraz daha kolaylaştırmak.


Veritabanını işlemek:


Kod:
// bir konsol uygulaması
#using <mscorlib.dll>

using namespace System;
using namespace ByteFX::Data::MySqlClient;

int _tmain()
{
  String * myConnectionString;
  String * mySqlString;
  MySqlConnection * myConnection;
  MySqlDataReader * myReader;

  myConnectionString = "Database=dotnet;Data Source=localhost;user id=root;password=;";

  myConnection = new MySqlConnection(myConnectionString);
  myConnection->Open();

  mySqlString = "SELECT * FROM users";
  MySqlCommand * myCommand = new MySqlCommand(mySqlString, myConnection);

/*
ExecuteReader yöntemine eğer SQL sorgunuz bir çıktı döndürüyorsa ihtiyacınız vardır ve çıktısının referansını myReader'a gönderir. Aksi taktirde UPDATE,INSERT,DELETE gibi çıktı döndürmeyen SQL komutlarında ExecuteNonQuery kullanılır

myCommand->ExecuteNonQuery();

*/
 
  myReader = myCommand->ExecuteReader();
  for(int i=0;myReader->Read();i++)
  {
    // ilk kolon integer tipinde ise
    int id = myReader->GetInt32(0);
    // ikinci kolon varchar veya text tipinde ise 
    String * username = myReader->GetString(1);
    System::Console::WriteLine("{0},{1}", __box(id), username);
  }

  myConnection->Close();

  return 0;
}

Yukarıdaki örnekte users tablosundaki tüm kayıtları çekip sadece ilk ve ikinci kolondaki bilgileri ekrana yazdırdık. Burda dikkat etmemiz gereken konu; eğer tanımladığımız nesneler içinde mySQL bağlantıları açıyorsak mutlaka kapamamız gerektiğidir. Aksi taktirde tanımlı olan mySQL ayarları sizin 10'dan fazla bağlantı açmanıza izin vermeyecek ve bir sonraki nesne yaratma isteminizde programınız hata vericektir. (Bu hata yukardaki program için geçerli olamaz çünki _tmain içerisinde tek bir bağlantı açtık.)


DataSet ve mySQL:


DataSet sınıfı System::Data 'nin altında bulunmaktadır. Bu sınıfın amacı veritabanından aldığımız veriler üzerinde gerçekleştirdiğimiz işlemleri kolaylaştırmak. Örneğin web servislerinde bir tablo bilgisi döndürmemiz gerektiğinde DataSet içerisindeki veriler kolaylıkla XML'e çevrilip SOAP aracılığı ile karşı tarafa iletilebilmekte. Veya hazırladığımız çok elemanlı formlar içerisinde DataSet ile arada bağlantı kurup bir form elemanı etkilendiğinde bu değişimin kolayca diğer elemanlarda gözlenmesi. Açıkcası dataset bir çok konuda kolaylık getiren ve kullanması kolay bir yapı.

DataSet 'i bir hamur gibi düşünmek sanırım yanlış olmaz. Bu hamur veritabanından aldığımız tablonun yapsına göre kendini şekillendirmektedir. Bunu şekillendirme daha evvel tanımlanmış adaptörler sayesinde gerçekleştirmektedir. Kısacası veritabanında yaptığımız bir sorgu sonucu karşımıza gelen çıktıyı, DataAdaptor sayesinde DataSet'in içine rahatlıkla uygulayabiliriz. Aşağıda bunla ilgili bir form uygulaması görücez.
 
Yeni bir C++.NET form uygulaması başlatınız ve form içine bir DataGrid yerleştiriniz. Forum'un "Title Bar" bölümünün üzerine çif tıklayarak form onload handler'ı yaratınız ve içini aşağıdaki gibi düzenleyiniz. (Bundan önce projeye referans olarak eklemeyi unutmayınız)


Kod:
using namespace ByteFX::Data::MySqlClient;
// mysql sürücülerini kullanıcağınızı yukarıda belirtmeyi unutmayınız

Kod:
private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)
        {
          String * myConnectionString;
          String * mySqlString;
          MySqlConnection * myConnection;
          MySqlCommand * myCommand;
          MySqlDataAdapter * myDataAdapter;
          DataSet * myDataSet;

          myConnectionString = "Database=dotnet;Data Source=localhost;user id=root;password=;";
          mySqlString = "SELECT * FROM users";

          myConnection = new MySqlConnection(myConnectionString);
          myCommand = new MySqlCommand(mySqlString,myConnection);
// connetion'ı açmadık çünki adaptör kendi açıyor
          myDataAdapter = new MySqlDataAdapter(myCommand);
          myDataSet = new DataSet("Users"); // dataset'in adı
// adaptör dataset'i tablo yapısına göre dolduruyor
          myDataAdapter->Fill(myDataSet);

          this->dataGrid1->DataSource = myDataSet->Tables->Item[0];
        }

Aşağıdaki çıktıdanda gördüğünüz gibi kullandığımız DataGrid'in DataSource özelliği sayesinde DataSet içerisindeki kolonlar ve satırlar mySQL de tanımladığımız gibi gözükmekte. DataSet'in daha bir çok özelliği bulunmakta. Örneğin çektiğiniz tabloları birbine bağlayabilirsiniz veya daha evvel bahsetiğim gibi formları birbirleri ile ilişkilendirirken tek dataset üzerinden çalışarak yazıcağınız kod satırını azaltabilirsiniz. Açıkcası dataset kavramı size daha az hata payı bırakıyor.

datagrid.jpg


İpucu:

1)mySQL'i indirip kurduktan sonra mysql\bin klasörü altında mysqladmin.exe yi çalıştırarak aktive edebilirsiniz. Gene bu araç sayesinde mySQL'i servis olarak tanımlayabilirsiniz.
2)Eğer yazdığınız uygulamayı dağıtmayı düşünüyorsanız indirdiğiniz mono kütüphanelerini yazılımınız ile dağıtmayı unutmayınız.
3)mySQL ADO.NET kurulumunu gerçekleştirmeden makinadaki tüm uygulamaların bu kütüphanelere erişmesini istiyorsanz C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 dizini altına ilgili assemblyleri kopyalamanız yeterlidir.
4)DataGrid deki değişiklikleri veritabanına işlemek için gene adaptör'ü kullanabilirsiniz.
5)DataSet'in içindeki verileri XML olarak çekmek isterseniz myDataSet->GetXml(); yöntemini kullanabilirsiniz..
 
Geri
Üst