404 Not Found.

Sayfa Bulunamadı

İstediğiniz sayfa sunucu üzerinde bulunamadı.

Not Found

The requested document was not found on this server.

Web Server at nesimia.com
Veritabanı bağlantıları
26.07.2008 - 19:15
EkleBunu Sosyal Paylaşım Butonu0 Yorum | 478 Okuma

QSqlDatabase sınıfını kullanarak veritabanı bağlantıları oluşturucağız.

Desteklenen sürücüler ile istediğimiz veritabanına bağlantı kurabiliriz. En basitinden aşağıdaki satırlar işimizi görecektir.

QSqlDatabase db = QSqlDatabase::addDatabase("sürücüTipi");
db.setHostName("sunucuAdresi");
db.setDatabaseName("veritabanıAdı");
db.setUserName("kullanıcıAdı");
db.setPassword("kullanıcıSifresi");
bool ok = db.open();


1.satırda QsqlDatabase tipinde bir değişken tanımlayıp bu değişkene QsqlDatabase::addDatabase("sürücü tipi");
satırı ile parantez içinde belirtiğimiz sürücü tipine göre, bir veritabanı nesnesi oluşturup atamış olduk. Bu sürücü tipini hangi veritabanına bağlanacaksanız ona göre belirtmeniz gerekir. Örneğin aşağıdaki tabloda bulunan sürücüleri kullanabilir ya da kendi yazdığınız bir sürücü varsa onu belirtebilirsiniz.  

Sürücü Tipi Açıklama
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server

 

Diğer satırlarda da sunucu adresi, veritabanı adı, kullanıcı adı, kullanıcı şifresini belirtiyoruz. Artık her şey hazır. Son satır yani db.open(); ile veritabanına bağlantı kurabiliriz. Bu satır bağlantı başarılı bir şekilde gerçekleştirilirse true aksi halde false değeri döndürecektir.

Şimdi küçük bir örnek üzerinde anlatılanları pekiştirelim. Eclipse açın ve yeni bir Qt uygulaması oluşturun. (module kısımında SQL modülünü seçmeyi unutmayın. Eğer Eclipse ortamında Qt projesi oluşturmayı bilmiyorsanız İlk projemiz sayfasını ziyaret etmek isteyebilirsiniz.) Ben sqltest isminde bir proje oluşturdum. sqltest.h dosyasında QSqlDatabase sınıfını uygulamaya dahil(include) ettiğimizi belirtin. Ardında private: kısmına QSqlDatabsae db; satırını ekleyin. Dosyamızı son hali aşağıdaki gibi olacak.

#include <QtGui/QWidget>
#include "ui_sqltest.h"
#include <QSqlDatabase>
class sqltest : public QWidget
{
    Q_OBJECT
public:
    sqltest(QWidget *parent = 0);
    ~sqltest();
private:
    Ui::sqltestClass ui;
    QSqlDatabase db;
   
};

ardından sqltest.cpp dosyasını açın ve kurucu fonksiyona aşağıdaki satırları yazın. (Ben daha önce oluşturduğum "test" isimli MySql veritabanına bağlantı kuracağım.) Hatta QMessageBox ile kullanıcıyı durumdan haberdar edelim.

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("nsm");
db.setPassword("******");
bool ok = db.open();
   
if (ok == false)
    QMessageBox::information(this,"nesimia.com","Bağlantı kurulamadı!");

Kodumuzu biraz daha geliştirelim ve bir hata oluştuğunda veritabanı sunucusunun dönderdiği hata mesajını da kullanıcıya bildirelim. Bunun için .cpp dosyasına QSqlError sınıfını dahil edin. (Eğer kullanacağınız tüm SQL sınıflarını tek tek dahil etmek hoşunuza gitmiyorsa #include <QSql> yazarak tüm sql sınıflarını uygulamaya dahil edebilirsiniz.)
Mesaj kutumuzu şu şekilde yeniden yazalım.

QMessageBox::information(this,"nesimia.com","Bağlantı kurulamadı! Hata mesajı :\n" + db.lastError().text() );

Birden fazla veritabanı kullanma:

En son oluşturulan bağlantı varsayılan olarak kullanılır. Bu durumda her bağlantıya isim vermemiz gerekir. İsim vermediğimiz takdirde hangi bağlantıya ulaşacağımızı bilemeyebiliriz.

Örneğin; mysql veritabanında "tablo1" isminde, sqlite veritabanında(bellekte) "users" isiminde tablomuz olsun.


Bağlantıları oluşturalım.

{

    db1 = QSqlDatabase::addDatabase("QSQLITE","db1");
    db1.setDatabaseName(":memory:");
    db1.open();

    QSqlQuery query(db1);
    query.exec("create table users (name varchar(20), pass varchar(20))");
    query.exec("insert into users(name, pass) values('admin', '123')");
    query.exec("insert into users(name, pass) values('qticari', '123')");
    query.exec("insert into users(name, pass) values('pardus', '123')");
    query.exec("insert into users(name, pass) values('turquaz', '123')");

    db2 = QSqlDatabase::addDatabase("QMYSQL","db2");
    db2.setHostName("localhost");
    db2.setDatabaseName("test");
    db2.setUserName("nsm");
    db2.setPassword("*****");
    db2.open();

}

Projenin farklı bir yerinden (başka sınıf) verilerimizi çekelim.

{
    //"db1" isimli veritabanı nesnesini dönder
    QSqlDatabase db1 = QSqlDatabase::database("db1");      

    //"db1" isimli veritabanı üzerinde sorgu çalıştırmak için.
    QSqlQuery query1(db1);
    query1.exec("select count(*) from users");
    query1.first();

    QMessageBox::information(this,"nesimia.com",query1.value(0).toString());

    //”db2” isimli veritabanı nesnesini dönder
    QSqlDatabase db2 = QSqlDatabase::database("db2");

    //”db2” isimli veritabanı üzerinde sorgu çalıştırmak iiçin.
    QSqlQuery query2(db2);
    query2.exec("select count(*) from tablo1");
    query2.first();

    QMessageBox::information(this,"nesimia.com",query2.value(0).toString());

}

Böylece Qt ortamında nasıl veritabanı bağlantısı yapılır öğrenmiş olduk. Bu anlatılanlar haricinde QSqlDatabase sınıfının birkaç önemli fonksiyonundan daha bahsetmek istiyorum.

db.close(); Aktif bağlantıyı sonlandırır.
db.transaction(); Transaction işlemini başlatır.
db.commit(); Transaction işlemini onaylar.
db.rollback(); Transaction işlemini geri alır.
db.setConnectOptions() Bağlantı seçeneklerini belirtebilmek için örneğin MySQL sunucusuna  SSL bağlantısı kurabilmek için db.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1"); Daha fazla bağlantı seçenekleri için tıklayın.

'Veritabanı bağlantıları' İle İlgili Diğer Yazılar İçin Tıklayın.

0 Yorum
Google
 
En Son Yorumlar (Makaleler)
  • Nesimi ACARCA:@Suat ATAN Galiba et-elipse-integration bileşenini yüklemediniz, en üstte ikinci pa...
  • Suat ATAN:Nesimi Bey Merhaba; QT'yi bir de windowsta deneyeyim dedim. QT mingw'yi de iç...
  • Suat ATAN:Nesimi Bey; C/C++ ile GUI programlamak neredeyse hayat amacım olmuştu. Java,PHP,JSP,...
  • Nesimi ACARCA:QObject::connect( f.ornekButton, SIGNAL(clicked()), 0, SLOT( ornek->show() ) ); &...
  • Cihan:Merhabalar, öncelikle bu güzel makale için tebrikler... Benim bir so...
  • Muallim:Kardeş Windows'ta denedim her şey güzel de, çalıştırma aşaması nasıl windows'ta ?...
  • Taner Senyurt:Hosgeldin aykut :D...
  • Aykut SAY:Merhabalar. biraz geç oldu ama QT ile bugün ilk kez tanıştım ve bir .Net geliştirici olarak yi...
  • Nesimi ACARCA:Bence tüm yüklemleri silip tekrar deneyin windows için http://www....
  • Doğugün Özkaya:kullandığım qt 4.3.4 olduğundan sanırım; "bin" klasörünün içinde qmake, uic ya da ...
Sponsor Bağlantı