qt 학습 노트(8)의 깊이QSqlQuery
5398 단어 qt
프로젝트 개발에서 시스템의 낮은 결합을 실현하기 위해 우리는 반드시 데이터베이스 기능 모듈을 봉인해야 한다.
1. prepare ()
먼저 헤더 파일 "attend db.h"를 생성합니다.
데이터베이스 작업을 초기화하는데 데이터베이스 파일 만들기, 테이블 만들기, 그리고 기초 데이터 추가를 포함한다.가장 좋은 것은 데이터베이스 조작의 일부 정보를 되돌려 주는 것이다. (가장 중요한 것은 오류 정보)
4
QSqlError db_Init()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:"); //
if(!db.open())
{
//
return db.lastError();
}
QSqlQuery query;
// , ,
if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VARCHAR)"))
{
return query.lastError();
}
if(!query.exec("CREATE TABLE table_user(user_id VARCHAR PRIMARY KEY, group_id INTEGER)"))
{
return query.lastError();
}
if(!query.exec("CREATE TABLE table_record(user_id VARCHAR, datetime VARCHAR)"))
{
return query.lastError();
}
//
if(!query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)"))
{
return query.lastError();
}
db_AddGroup(query, 1, "student");
db_AddGroup(query, 2, "teacher");
//
if(!query.prepare("INSERT INTO table_user(user_id, group_id) VALUES(:user_id, :group_id)"))
{
return query.lastError();
}
db_AddUser(query, "T0001", 2);
qdb_AddUser(query, "T0002", 2);
db_AddUser(query, "S111201", 1);
//
if(!query.prepare("INSERT INTO table_record(user_id, datetime) VALUES(:user_id, :datetime)"))
{
return query.lastError();
}
db_AddRecord(query, "T0001", QDateTime::currentDateTime());
db_AddRecord(query, "T0002", QDateTime::currentDateTime());
db_AddRecord(query, "S111201", QDateTime::currentDateTime());
return QSqlError();
}
이 테이블에 추가된 데이터는 QSqlQuery:exec()를 사용하여 문장을 직접 실행하는 것이 더 이상 간단하지 않습니다.모듈화를 위해서, 우리는 표 데이터에 대한 조작 함수 (삭제, 수정 포함) 를 봉인해야 한다.상부 응용에 사용할 수 있도록 대외적인 인터페이스를 제공하다.형삼은 단지 표의 참량일 뿐, 이렇게 명확하고 명료하게 하는 것이 가장 좋다.
Qt는 bool prepare(const QString &query) 인터페이스를 제공합니다.(SQLite에서도 API 함수를 사용할 수 있음)
query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")
우리는 먼저 prepare () 함수를 사용했는데, 그 중에서 ': group id' 와 ': group name' 을 이용하여 구체적인 데이터를 대체한 다음에 bindValue () 함수를 이용하여 group 에 줄 수 있다id 및 groupname 두 속성에 값을 부여합니다. 이것은 귀속 작업이라고 합니다.
예:
query.bindValue(0, 1);
query.bindValue(1, 'student');
여기서 번호 0과 1은 각각 ":group id"와 ":group name"을 나타냅니다. 즉, prepare() 함수에 따라 나타나는 속성은 왼쪽에서 오른쪽, 맨 왼쪽은 0입니다.여기 있는 ": group id"와 ": group name"은 자리 차지 문자라고 하는데, 이것은 ODBC 데이터베이스의 표현 방법이고, 또 하나의 Oracle 표현 방법은 모두 "?"이라고 한다.번호
query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(?, ?)")
이것은 단일 기록에 대한 귀속입니다. 물론 귀속이 끝나면 exec () 를 호출해야 합니다. 그렇지 않으면 문장이 실행되지 않습니다.
ODBC의 표현 방법을 사용할 때, 우리도 번호를 실제 자리 차지 문자로 대체할 수 있다.여기는 구체적으로 소개하지 않겠습니다.
우리도 대량 처리를 할 수 있다
void addBindValue(const QVariant& val, QSql::ParamType type = QSql::In);
addBindValue()를 호출하여 val 값 목록을 추가합니다.
4
QVariantList GroupIDs;
GroupIDs << 1 << 2;
QVariantList GroupNames;
GroupNames << "student" << "teacher";
query.addBindValue(GroupIDs);
query.addBindValue(GroupNames);
query.execBatch();
ececBatch()의 문서를 검토합니다./*
Executes a previously prepared SQL query in a batch. All the bound parameters have to be lists of variants. If the database doesn't support batch executions, the driver will simulate it using conventional exec() calls.
*/
만약 데이터베이스가 대량 처리를 지원하지 않는다면, exec () 로 대체합니다.
2. SQL 문을 실행한 후 되돌아오는 결과 집합
/*다음은 오리지널, 존속 전재가 아닙니다.*/
결과 집합은 사실 조회된 모든 기록의 집합입니다. QSqlQuery 클래스에서 여러 함수를 제공하여 이 집합을 조작합니다. 이 집합의 기록은 0부터 번호가 매겨져 있음을 주의해야 합니다.가장 많이 사용하는 항목은 다음과 같습니다.
seek (int n):query는 결과 집합의 n조 기록을 가리킨다.
first ():query는 결과 집합의 첫 번째 기록을 가리킨다.
last ():query는 결과 집합의 마지막 기록을 가리킨다.
next ():query는 다음 기록을 가리키며, 이 함수를 실행할 때마다 인접한 다음 기록을 가리킨다.
previous ():query는 이전 기록을 가리키며, 이 함수를 실행할 때마다 인접한 이전 기록을 가리킨다.
record (): 현재 가리키는 기록을 얻습니다.
value (int n): 속성의 값을 얻습니다.그 중에서 n은 당신이 조회한 n번째 속성을 나타낸다. 예를 들어 우리가'select * from student'를 사용하면'select id,name from student'에 해당한다. 그러면value(0)는 id 속성의 값을 되돌려주고value(1)는name 속성의 값을 되돌려준다.이 함수는 QVariant 유형의 데이터를 되돌려줍니다. 이 유형과 다른 유형의 대응 관계에 대해 도움말에서 QVariant를 볼 수 있습니다.
at (): 현재query가 가리키는 결과가 집중된 번호를 얻습니다.
query를 막 실행했을 때 설명이 필요합니다.exec(“select * from student”);이 코드를 사용할 때query는 결과 집합 이외를 가리키며query를 사용할 수 있습니다.next (), 이 코드를 처음 실행할 때query는 결과 집합의 첫 번째 기록을 가리킨다.물론 우리도seek(0)함수나first()함수를 이용하여query가 결과집의 첫 번째 기록을 가리킬 수 있다.하지만 메모리 비용을 절약하기 위해 추천하는 방법은query에서입니다.exec(“select * from student”);이 줄 코드 앞에query를 추가합니다.setForwardOnly(true);이 코드는 이후에next()와seek() 함수만 사용할 수 있습니다.
친구들.신봉절 잘 보내세요.
여기에 프로그램 소스 코드 다운로드 링크를 첨부합니다: qtQSqlQuery 심층 분석
이상은 순전히 개인 학습 노트입니다. 만약 어디가 틀렸다면 제출하시기 바랍니다.여러분과 함께 공부하고 함께 진보하기를 바랍니다.내 이메일 주소:[email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt How to use connect between incompatible signal and slotIn this I want to call a function, that function will receive a point . But this function should be invoked by a timer's...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.