データベースを構築し、開きます
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):ソリューションを