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. |