Qt5データベース接続の一般的な問題と解決策

データベースを構築し、開きます

QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("MyDataBase.db");
if (!database.open())
{
	qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
 	qDebug() << "Succeed to connect database." ;
}

テーブルを作成します。

QSqlQuery sql_query;
    if(!sql_query.exec("create table allfilesdata(  \
                       fileid INTEGER primary key AUTOINCREMENT,    \
                       filename text UNIQUE,  \
                       filepath  text NOT NULL, \
                       filesize INTEGER, \
                       fileattributes INTEGER NOT NULL, \
                       creat_dwlowtime INTEGER NOT NULL,    \
                       creat_dwhightime INTEGER NOT NULL,   \
                       lastaccess_dwlowtime INTEGER NOT NULL,   \
                       lastaccess_dwhightime INTEGER NOT NULL,  \
                       lastwrite_dwlowtime INTEGER NOT NULL,    \
                       lastwrite_dwhightime INTEGER NOT NULL)"))
    {
        qDebug() << "Error: Fail to create table."<< sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }

挿入データ

QSqlQuery sql_query;
sql_query.prepare("INSERT INTO allfilesdata(filename,filepath,filesize,fileattributes,creat_dwlowtime,creat_dwhightime,lastaccess_dwlowtime,lastaccess_dwhightime,lastwrite_dwlowtime,lastwrite_dwhightime) VALUES(:filename,:filepath,:filesize,:fileattributes,:creat_dwlowtime,:creat_dwhightime,:lastaccess_dwlowtime,:lastaccess_dwhightime,:lastwrite_dwlowtime,:lastwrite_dwhightime)");
sql_query.bindValue(":filename",QString::fromStdWString(fd.cFileName));
sql_query.bindValue(":filepath",QString::fromStdWString(folder));
sql_query.bindValue(":filesize",(int)(fd.nFileSizeHigh*(MAXDWORD + 1) + fd.nFileSizeLow));
sql_query.bindValue(":fileattributes",(int)fd.dwFileAttributes);
sql_query.bindValue(":creat_dwlowtime",(int)fd.ftCreationTime.dwLowDateTime);
sql_query.bindValue(":creat_dwhightime",(int)fd.ftCreationTime.dwHighDateTime);
sql_query.bindValue(":lastaccess_dwlowtime",(int)fd.ftLastAccessTime.dwLowDateTime);
sql_query.bindValue(":lastaccess_dwhightime",(int)fd.ftLastAccessTime.dwHighDateTime);
sql_query.bindValue(":lastwrite_dwlowtime",(int)fd.ftLastWriteTime.dwLowDateTime);
sql_query.bindValue(":lastwrite_dwhightime",(int)fd.ftLastWriteTime.dwHighDateTime);
if(!sql_query.exec())
{
	qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "inserted data successfully!";
}

プレースホルダ

QSqlQuery sql_query;
QString searchstr="select * from allfilesdata where filename LIKE :linetext";
sql_query.prepare(searchstr);
sql_query.bindValue(":linetext",QString("%%1%").arg(linetext));

なおは、LIKE句のパーセント記号(%)は、SQL文字列に存在しないが、結合値のプレースホルダは、場合に発生、およびSQL文字列内のLIKE句を使用することができません単一引用符(「)、など、その後LIKE句単一引用符を使用する必要がない、プレースホルダ文字列型です(」)

エスケープ文字

sqliteを「/」、バックスラッシュで単一引用符でエスケープが、単一引用符で、一重引用符(「」)の前に単一引用符と連結されていません

一括挿入データのトランザクションを使用してQtの接続Sqliteを

バッチモードでの方法であって、

 dbT1.transaction();	 	//开始启动事务
   inQry.prepare("insert into datatable values (?,?,?)");
   while(!ReadDat.atEnd())
   {
       strTextData = ReadDat.readLine();
       listIndex << datIndex;
       tmStamp << tmStampCnt;
       dtData << strTextData;
       datIndex++;
       DatWin->append(strTextData);
   }
   //绑定数据,顺序应与表结构字段数据一致
   inQry.addBindValue(listIndex);	//绑定数据
   inQry.addBindValue(tmStamp);		//绑定数据
   inQry.addBindValue(dtData);		//绑定数据
   inQry.execBatch();		//进行批处理操作
   dbT1.commit();		//提交事务,此时打开数据库文件执行SQL语句
  
   //不加下面三句,重复操作上面语句时,数据库不会有新的添加
   //因为作为主键的listIndex内有原数据,此时数据库不会保存主键值重复的内容
   listIndex.clear();
   tmStamp.clear();
   dtData.clear();

第二の方法プレースホルダの方法:

   dbT1.transaction();
   while(!ReadDat.atEnd())
   {
       strTextData = ReadDat.readLine();
       inQry.prepare("insert into datatable(tIndex, tTimStamp, tDistance)"
                         "values(:tIndex, :tTimStamp, :tDistance)");
        inQry.bindValue(0,datIndex);
        inQry.bindValue(1,tmStampCnt);
        inQry.bindValue(2,strTextData);
        inQry.exec();
        datIndex++;
        DatWin->append(strTextData);
   }
   dbT1.commit();

Qt5エラーmysqlデータベースを接続するとき

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
QSqlQuery::prepare: database not open

理由1エラー:libmysql.dllを欠落している
ソリューション:\の下にMySQLのディレクトリは、ビルドディレクトリにMySQLサーバ5.5 \ libに\ libmysql.dllをプロジェクトをコピー

エラー理由2:MySQLサーバが開かない
解決策:systemctr開始mysqld.service(centos7を)

エラー理由3:サーバは、ファイアウォールオフにしない
systemctr停止firewalld.service(centos7):ソリューションを

リリース6元記事 ウォンの賞賛0 ビュー37

おすすめ

転載: blog.csdn.net/hellozhuzhuye/article/details/102652854