- 連接數據庫
QSqlDatabase db; bool m_bIsConn; db.setHostName("127.0.0.1"); db.setPort(1521); db.setDatabaseName("orcl"); db.setUserName("ATIMS"); db.setPassword("123"); if(db.open()) { qDebug()<<QString(u8"連接成功"); m_bIsConn = true; } else { qDebug()<<"連接失敗"; m_bIsConn = false; }
2.查詢數據庫
if(m_bIsConn) { QSqlQuery query; bool bSuccess = query.exec("select * from TableName"); if(bSuccess) { QSqlRecord rec = query.record(); qDebug()<<tr("TableName的字段個數:")<<rec.count(); QSqlField filed = rec.field(0); qDebug()<<tr("字段名稱:")<<rec.field(0).name()<<tr("字段類型:")<<rec.field(0).type()<<tr("字段值:")<<rec.field(0).value(); qDebug()<<tr("字段名稱:")<<rec.field(1).name()<<tr("字段類型:")<<rec.field(1).type()<<tr("字段值:")<<rec.field(1).value(); qDebug()<<tr("字段名稱:")<<rec.field(2).name()<<tr("字段類型:")<<rec.field(2).type()<<tr("字段值:")<<rec.field(2).value(); qDebug()<<tr("字段名稱:")<<rec.field(3).name()<<tr("字段類型:")<<rec.field(3).type()<<tr("字段值:")<<rec.field(3).value(); } else { qDebug()<<tr("error"); } }
細細品味,有點類似.net中的反射,通過這些屬性可以實現通用數據訪問層的封裝
3.插入數據
if(m_bIsConn) { QSqlQuery query(db); bool bSuccess = false; QTime t; t.start(); query.prepare("insert into TableName values(:a,:b,:c,:d)"); long records = 100; QString strTemp = ""; for(int i=0;i<records;i++) //插入100條數據 { query.bindValue(":a",i); strTemp = QString("name-%1").arg(i); query.bindValue(":b",strTemp); query.bindValue(":c",16.0); query.bindValue(":d","note"); bSuccess = query.exec(); if(!bSuccess) { QSqlError error = query.lastError(); qDebug()<<i<<error.driverText()<<QString("插入數據失敗!"); qDebug()<<i<<error.text()<<QString("插入數據失敗!"); } //qDebug()<<query.executedQuery(); qDebug()<<query.lastQuery(); } qDebug()<<tr("插入 %1 條記錄,耗時: %2 ms").arg(records).arg(t.elapsed()); }
在插入數據准備Sql語句時需要注意,可以使用Oracle類型的占位符和ODBC類型的占位符,這里使用的是Oracle類型的占位符。Qt對所有數據庫均可以支持Oracle類型的占位符和ODBC類型的占位符。
尤其需要注意的是在sql語句結束時不能加“;”(分號),否則會報“"ORA-00933: SQL 命令未正確結束\nUnable to execute statement" "插入數據失敗!"”錯誤,和在C#中有所不同,如果有知道怎么回事的仁兄可以留言指導一下。