linux qt mysql

 

Linux下完整的MySQL開發需要安裝服務器端,如果安裝客戶端也沒什麼不好。

  環境說明:

  ubuntu 10.04.2

  QtSDK (1.5G安裝包的那個)

  mysql5.1

  1.安裝MySQL

  Linux下完整的MySQL開發需要安裝服務器端,如果安裝客戶端也沒什麼不好。直接在軟件中心搜mysql,把client和server選上。

  server在安裝時會提示爲root用戶設置密碼,設一個好了。

  我使用的是mysql5.1版本,用戶名密碼存儲在一個叫mysql的數據庫裏,只有管理員級別才能看到。

  如果直接在終端中輸入 mysql,可能會提示ERROR 1045 (28000),這是因爲這時候你是以自己用戶名訪問數據庫,而目前數據庫中只有一個root用戶。沒關係,如果有必要,可以添加一個用戶進去:

  mysql -uroot -p -->以root用戶登錄,

  grant usage on *.* to dummy@localhost; -->授權名爲dummy的用戶本地登錄,這裏換成自己的用戶名就可以了。

  不過這時候直接mysql只有普通的權限,創建數據庫、操作mysql都是不可以的,如果真有將其賦予管理員權限的需要,可以自己查閱有關資料。

  2.安裝Qt的MySQL驅動

  方法一:直接sudo apt-get install libqt4-sql-mysql ,這是Qt4的mysql驅動,就不用自己費勁編譯了,不過可能會額外下載一些東西。

  將 /usr/lib/qt4/plugins/sqldrivers/libqsqlmysql.so拷貝到你的QtSDK sqldrivers目錄下,我當時是直接用普通權限安裝,目錄爲:~/QtSDK/Desktop/Qt/473/gcc/plugins/sqldrivers。

  方法二:其實你也可以sudo apt-get download libqt4-sql-mysql,把包解壓縮,然後把裏面的so文件搜出來直接拷貝到那裏。

  方法三:乖乖按照官方方法編譯,但是貌似可行性不大,因爲新版本的QtSDK並沒有src目錄,默認也沒有mysql的驅動。

  3.做個demo試一下

  記得在pro文件中 QT +=那裏加上sql,否則qmake是不會去找sql的相關部分的。

  #include

  #include

  #include

  int main(int argc, char *argv[])

  {

  QCoreApplication a(argc, argv);

  QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");

  db.setHostName("localhost");

  db.setDatabaseName("study");

  db.setUserName("root");

  db.setPassword("tyh");

  if(!db.open()){

  qDebug()<<"Unable to open database";

  }else{

  qDebug()<<"Database connection established";

  }

  return a.exec();

  }

  這裏study這個數據庫之前我已經創建過了,如果連接成功,就會顯示Database connection established。 我是建立的控制檯程序哈。

二:

1.安裝unix/ODBC驅動程序

2.重新編譯qt/src/plugins/sql drivers/mysql,生成一個so文件,放在QT安裝目錄下的plugins/sql drivers文件夾下

3.QT編寫程序,代碼如下

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

  db.setHostName("192.168.1.15");  db.setDatabaseName("test");  db.setUserName("root");  db.setPassword("linqinong");  bool r = db.open();qDebug() << db.isOpen();  if (r) {ui->label->setText("MY SQL Server Connect OK!");  } else {ui->label->setText("no open");  }------------------------------------------------------爲了確保QMYSQL驅動是否可用可以在main函數裏添加以下代碼int main(int argc, char *argv[]){  QApplication a(argc, argv);  Widget w;  w.setGeometry(0,0,320,240);  w.setWindowFlags(Qt::FramelessWindowHint);  w.show(); qDebug() << "Available drivers:"; QStringList drivers = QSqlDatabase::drivers(); foreach(QString driver, drivers) qDebug() << "\t" << driver; //QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //qDebug() << "ODBC driver valid?" << db.isValid(); //db = QSqlDatabase::addDatabase("QODBC");  return a.exec();}三:
之前用 C 語言連了mysql數據庫,因爲項目畢竟是用QT包裝的,還需要在qt的界面裏顯示,所以這一次就用QT來連一下mysql。
首先說一下我的電腦是ubuntu10.10;之前安裝了QT的linux全部套件(包括QT creator),也安裝了嵌入式qt的那三個編譯環境(X11,X86,ARM),但是這一次我只用QT creatot裏的qmake編譯(以爲之前編譯完那三個環境後,我就把編譯文件夾全刪了)。
首先,安裝mysql客戶端(mysql-devel),和C語言連接一樣,執行命令:
1. sudo apt-get install libmysqlclient-dev   
2. 或   
3. sudo apt-get install libmysqlclient15-dev  
因爲我之前安裝過,所以這一步就省略了。
然後,連接linux數據庫肯定要有驅動,這個在qt的源碼裏就有:進入文件夾:
1. cd   QTDIR/src/plugins/sqldrivers/mysql                      //這就是qt存放mysql驅動源碼的目錄 
目錄裏應該有main.cpp 和moc_qsql_mysql.cpp兩個文件
執行命令:

1

qmake  -project  //生成mysql.pro文件,可能這一步會說你沒有權限,那麼chmod給它權限就可以了  

2

qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient_r" mysql.pro   

3

/usr/include/mysql   // mysql所有頭文件所在的位置,mysql.h就在此處  

4

/usr/lib/mysql            //mysql庫的位置 

然後,執行命令:
1. make  
2. sudo make install 
此時,在QTDIR/src/plugins/sqldrivers/mysql  這個目錄下,就生成了一個文件:libqsqlmysql.so;把它拷貝到QTDIR/plugins/sqldrivers, 目錄下面;
現在開始編程:隨便建工程:加入如下代碼:
1. #include <QtSql>     <TD style="BORDER-RIGHT: #f0f0f0; BORDER-TOP: #f0f0f0; BORDER-LEFT: #f0f0f0; BORDER-BOTTOM: #f0f0f0; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" height=19 x:str="2. #include <QMessageBox> ">2. #include <QMessageBox>     <TD style="BORDER-RIGHT: #f0f0f0; BORDER-TOP: #f0f0f0; BORDER-LEFT: #f0f0f0; BORDER-BOTTOM: #f0f0f0; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" height=19 x:str="3. #include <QTextStream> ">3. #include <QTextStream>     4. QTextStream out(stdout);     5. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");     6. db.setHostName("localhost");     7. db.setDatabaseName("test");     8. db.setUserName("root");     9. db.setPassword("****");     10. if(!db.open())     11. {     12.  QMessageBox::critical(0,QObject::tr("Database Error"),db.lastError().text());     13. return a.exec();     14. }     15. QSqlQuery query;     16. query.exec("SELECT * FROM t_homedata");     17. while(query.next())     18. {     19. QString id = query.value(0).toString();     20.  QString type = query.value(1).toString();     21. QString data = query.value(2).toString();     <TD style="BORDER-RIGHT: #f0f0f0; BORDER-TOP: #f0f0f0; BORDER-LEFT: #f0f0f0; BORDER-BOTTOM: #f0f0f0; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" height=19 x:str='22. out << id << ", " << type << ", " << data <22. out << id << ", " << type << ", " << data <<endl;     23. }    注意,這段代碼,是我加入到工程中的,恩,我就放在main.cpp裏;#include <QtSql>這個是必須的;#include <QTextStream>這個是用來進行控制檯打印輸出的,我的數據庫名爲test,中間有一個表叫t_homedata,表裏有三個varchar型字段:其打印結果爲: 1. 100010, 23, 32.45   2. 100011, 12, 99   3. 100012, 11, 35.10  注意,再進行工程的編譯和運行之前(恩,因爲我的電腦裏實際有4個qt編譯環境,所以還需要再Qt creator的project選項裏設置該項目的編譯器,我的編譯器設置爲qt-opensource,即Qt  creator自帶的,因爲我之前所進行的mysql驅動編譯也都是再Qt creator的安裝目錄裏進行的),一定別忘了在工程的.pro文件里加上下面一行: 1. QT  += sql  Qt 幫助文檔裏就是這麼說的: 1. To include the definitions of the module's classes, use the following directive:   <TD style="BORDER-RIGHT: #f0f0f0; BORDER-TOP: #f0f0f0; BORDER-LEFT: #f0f0f0; BORDER-BOTTOM: #f0f0f0; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" height=19 x:str="2. #include <QtSql> ">2.  #include <QtSql>  3. To link against the module, add this line to your qmake .pro file:   4.  QT += sql   5. define DRIVER       "QMYSQL3"  /* see the Qt SQL documentation for a list of available drivers */   6.  define DATABASE     ":dehua:" /* the name of your database */   7.  define USER         "root"   /* user name with appropriate rights */   8.  define PASSWORD     "password"   /* password for USER */   9.  define HOST         "http://192.168.10.14" /* host on which the database is running */   10.  bool ServerInfo::connMysql(int csID, QString msg)   11.  {   12.    MYSQL mysql;   13.    char host[32]="localhost";   14.    char user[32]="root";   15.    char passwd[32]="password";   16.    char dbname[32]="dehua";    17.    QString sql;   18 19.    if( mysql_init(&mysql) == NULL ) /*初始化數據結構*/   20.    {   21.      syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n");   22.      return FALSE;   23.    }   24.    if(mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL) /*連接數據庫*/   25.    {   26.      syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));   27.      return FALSE;   28.    }   29 30.     msg.replace("'"," ");        //去掉單引號        sql=QString("insert into socRec(socketID,message) values(%1,'%2')")   32.                                     .arg(csID)   33.                                  .arg(msg); /*構造SQL語句*/   34.     qWarning(sql);   35.    if(mysql_query(&mysql,sql) != 0) /*執行SQL語句,進行檢索數據*/   36.    { /*執行SQL語句出錯*/   37.      syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));   38.      qWarning("false");   39.    }   40.    else   41.    {   42.      qWarning("true");   43.    }   44.  } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章