MySQL'de Bool Tip?
07.11.2007 - 23:46
EkleBunu Sosyal Paylaşım Butonu0 Yorum | 424 Okuma

Bir çoÄŸunuzun bildigi üzere MySQL'de Bool tip yoktur. Genelde bu tip yerine tinyint kullanılır zaten bazı mysql gui programlarıda bool olarak belirttiÄŸiniz kolonların tipini tinyint(1) olarak deÄŸiÅŸtirir.

Aslında taşınabilirlik adına böylesi daha iyidir. Çünkü tüm veritabanlarında true, false yerine 0 ve 1 kullanmak daha rahat olabilir. Ama gel görki verileri listelerken kullanıcıya 0, 1 göstermek pekte iyi olmicektir. Misal QT3'deki QDataTable'da veriler söyle görünecektir.

böyle görüntülemektense true yada false veya qdatatable'nın trueText, falseText gibi özelliklerini özelleÅŸtirerek Evet veya Hayır diye görüntülemek göze daha çok hitap edip, anlaşılabilirliÄŸi artıracaktır. Geçenlerdeki bir projede bu sorun aÅŸmam gerekti ama nasıl?

QT3'ün kaynak kodlarını indirip, sql sürücülerinin kaynak kodlarını incelemeye baÅŸladım. Direk bir patch yapmaktansa yeni bir sürücü oluÅŸturmak daha mantıklı geldi. Sql sürücülerinin bulunduÄŸu dizindeki mysql dizinini kopyalayıp "qsql_mysql.cpp" dosyanın adını "nsql_mysql.cpp" olarak deÄŸiÅŸtirip sürücü isiminide "qmysql"den "nmysql" e çevirdim ve

QVariant::Type qDecodeMYSQLType( int mysqltype, uint flags )

{

QVariant::Type type;

switch ( mysqltype ) {

case FIELD_TYPE_TINY :

case FIELD_TYPE_SHORT :

case FIELD_TYPE_LONG :

case FIELD_TYPE_INT24 :

olan fonksiyonu

QVariant::Type qDecodeMYSQLType( MYSQL_FIELD* field ){
int mysqltype = field->type;

uint flags = field->flags;
QVariant::Type type;
switch ( mysqltype ) {
case FIELD_TYPE_TINY :
//EÄŸer uzununluÄŸu 1 ise bool olarak belirle.

if (field->length == 1 ){

type = QVariant::Bool;

break;

}
case FIELD_TYPE_SHORT :

case FIELD_TYPE_LONG :

case FIELD_TYPE_INT24 :
case FIELD_TYPE_SHORT :

case FIELD_TYPE_LONG :

case FIELD_TYPE_INT24 :

olarak deÄŸiÅŸtirip eski fonksiyonu çağıran diÄŸer kodlarıda qDecodeMYSQLType( MYSQL_FIELD* field ) deÄŸerini alacak ÅŸekilde yeniden düzenledim. Çünkü bu fonksiyon içerisinde kolonun uzunluÄŸunu elde etmem gerekliydi. Çünkü sürücümüzde kolon tipi tinyint ve uzunluÄŸu 1 ise bool dur. Sizde veritabanında bu kurala uyarak bu sürücüyü istediÄŸiniz gibi kullanabilirsiniz.

Böylece kolon tiplerini belirtmiÅŸ olduk. Artık kolon tiplerimiz bool olarak dönecek fakat hala verileri bool olarak gönderemedik bunun içinde;

QVariant QMYSQLResult::data( int field )

{

    if ( !isSelect() || field >= (int) d->fieldTypes.count() ) {

    qWarning( "QMYSQLResult::data: column %d out of range", field );

    return QVariant();

    }
  
    QString val( d->row[field] );

    switch ( d->fieldTypes.at( field ) ) {

    case QVariant::LongLong:

    return QVariant( val.toLongLong() );

olan fonksiyonuda

QVariant QMYSQLResult::data( int field ){

    if ( !isSelect() || field >= (int) d->fieldTypes.count() ) {

    qWarning( "QMYSQLResult::data: column %d out of range", field );

    return QVariant();

    }
  
    QString val( d->row[field] );

    switch ( d->fieldTypes.at( field ) ) {

    /** kolon tipi bool döneceÄŸinden veriyide bool olarak dönüÅŸtürdüm.

    *** 0 = False;

    *** 1 = True

    **/

    case QVariant::Bool:{        

        QVariant b ( !(bool)(val == "0"), 1 );

        return ( b );      

    }

    case QVariant::LongLong:

    return QVariant( val.toLongLong() );

 olarak deÄŸiÅŸtirip sürücüyü yeniden derledim ve iÅŸte sonuç.

hatta trueText ve falseText özellikleri ile oynayıp Evet, Hayır olarak göstermek daha bi albenili olacaktır, iÅŸte;

EÄŸer ben bu kadar ÅŸeyle uraÅŸamam diyorsanız benim düzenlediÄŸim sürücünün kaynak kodları ve derlenmiÅŸ dosyası için tıklayın.

http://www.nesimia.com/projects/qt3-icin-mysql-driver-nmysqldriver

Veritabanına baÄŸlanırken sürücü olarak az önce oluÅŸturduÄŸumuz sürücünün adını belirtmeniz yeterli (Bu örnekte NMYSQL1 siz istediÄŸiniz bir ismi verebilirsiniz. )  örnek bir cpp kodu;

defaultDB = QSqlDatabase::addDatabase( "NMYSQL1");

defaultDB->setDatabaseName( "veritabaniadi" );

defaultDB->setUserName( "kullaniciadi" );

defaultDB->setPassword( "sifre" );

defaultDB->setHostName( "sunucu" );

defaultDB->open();
Etiketler : mysql - cpp - qt

'MySQL'de Bool Tip?' İle İlgili Diğer Yazılar İçin Tıklayın.

0 Yorum
'MySQL'de Bool Tip?' İle İlgili Diğer Yazılar :
    Google
     
    En Son Yorumlar (Blog)
    • Nesimi ACARCA:Yazım hatası, hemen düzeltiyorum. :) Ayrıca ilginiz için teÅŸekkürler. Mail yoluyla sizinle il...
    • Alparslan Duran:Selamlar e mail adresinizi anlamadım o aradaki (qt) @ anlamına mı gelmekte ??? Neys...
    • TEYMUR:iyi videosu olsa lap iyi ...
    • mali:iÅŸte gidiyorum arkama bakmadan bıraktıklarıma piÅŸman olmadan ama bi...
    • Nesimi ACARCA:Son sorudan baÅŸlayayım. Aslında öğrendiklerimi, bildiklerimi sizlerle paylaÅŸmak için yazıyor...
    • sahin:qt, eclipse ve kdevelop öğrenebilmemiz için türkçe kitap veya kaynak varmı? yoksa siz böyle b...
    • Nesimi ACARCA:İhtiyaç duyulduktan sonra neden yapılmasın, iÅŸlerim bitsin bir göz atarım. Zaten dediÄŸiniz g...
    • Ömer F. USTA:mesala QR barcode sisteminde 3 tane büyük kare var bunlar etiketin orta yerini &...
    • Nesimi ACARCA:Bunlar baya karışık gibi :) inÅŸallah onlarıda yaparız. Artık bir standartın gelmesi ÅŸart, Ã...
    • Ömer F. USTA:EÄŸer uygulama Türkiye kullanımı ile kısıtlı kalmayacaksa USA'de sıklıkla ...
    Sponsor Bağlantı