📄 sql.html
字号:
return 0;
}
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-connect1-main-cpp.html">sql/overview/connect1/main.cpp</a>
</em></p>
</blockquote><p> 在以上代码中我们先通过<a href="qsqldatabase.html#addDatabase">QSqlDatabase::addDatabase</a>()激活了一个数据库驱动程序,传入了驱动程序名。现在可利用的驱动程序为:<a href="sql-driver.html#QODBC3">QODBC3</a>(开放数据库连接)、<a href="sql-driver.html#QOCI8">QOCI8</a>(Oracle 8和9)、<a href="sql-driver.html#QTDS7">QTDS7</a>(Sybase Adaptive Server和Microsoft SQL Server)、<a href="sql-driver.html#QPSQL7">QPSQL7</a>(PostgreSQL 6和7)和<a href="sql-driver.html#QMYSQL3">QMYSQL3</a>(MySQL)。请注意部分驱动程序并未包括在Qt的自由版中,详细情款请查看README文件。
<p> 连接创建后就成为应用程序的默认数据库连接并可为Qt的SQL类所使用。
<p> 其次我们调用了setDatabaseName()、setUserName()、setPassword()和setHostName()来初使化连接信息。对于QOCI8(Oracle 8和9),TNS服务名称必须由setDatbaseName()传递。当连接ODBC数据源时,数据源名称(DSN)必须在setDatabaseName()调用中使用。
<p> 最后我们调用了open()来打开数据库以存取数据,如果该步失败将返回假,用户可通过<a href="qsqldatabase.html#lastError">QSqlDatabase::lastError</a>()来查明错误信息。
<p> <a name="Connecting_to_Multiple_Databases"></a>
<h3> 连接多个数据库
</h3>
<a name="5-1"></a><p> 连接至多个数据库需要在使用<a href="qsqldatabase.html#addDatabase">QSqlDatabase::addDatabase</a>()传入两个参数,其中第二个参数用来指明这个连接的唯一标识符。
<p> <a name="create_connections"></a>
<pre> #include <<a href="qapplication-h.html">qapplication.h</a>>
#include <<a href="qsqldatabase-h.html">qsqldatabase.h</a>>
#include "../login.h"
bool createConnections();
int main( int argc, char *argv[] )
{
<a href="qapplication.html">QApplication</a> app( argc, argv );
if ( createConnections() ) {
// 数据库被成功打开,得到它们的指针:
<a name="x2148"></a> <a href="qsqldatabase.html">QSqlDatabase</a> *oracledb = QSqlDatabase::<a href="qsqldatabase.html#database">database</a>( "ORACLE" );
// 现在我们可以在oracle连接或默认连接上执行SQL命令
}
return 0;
}
bool createConnections()
{
// 创建默认数据库连接
<a name="x2147"></a> <a href="qsqldatabase.html">QSqlDatabase</a> *defaultDB = QSqlDatabase::<a href="qsqldatabase.html#addDatabase">addDatabase</a>( DB_SALES_DRIVER );
if ( ! defaultDB ) {
<a href="qapplication.html#qWarning">qWarning</a>( "Failed to connect to driver" );
return FALSE;
}
<a name="x2151"></a> defaultDB-><a href="qsqldatabase.html#setDatabaseName">setDatabaseName</a>( DB_SALES_DBNAME );
<a name="x2154"></a> defaultDB-><a href="qsqldatabase.html#setUserName">setUserName</a>( DB_SALES_USER );
<a name="x2153"></a> defaultDB-><a href="qsqldatabase.html#setPassword">setPassword</a>( DB_SALES_PASSWD );
<a name="x2152"></a> defaultDB-><a href="qsqldatabase.html#setHostName">setHostName</a>( DB_SALES_HOST );
<a name="x2150"></a> if ( ! defaultDB-><a href="qsqldatabase.html#open">open</a>() ) {
<a href="qapplication.html#qWarning">qWarning</a>( "Failed to open sales database: " +
<a name="x2149"></a> defaultDB-><a href="qsqldatabase.html#lastError">lastError</a>().driverText() );
<a href="qapplication.html#qWarning">qWarning</a>( defaultDB-><a href="qsqldatabase.html#lastError">lastError</a>().databaseText() );
return FALSE;
}
// 创建一个名为oracle的连接
<a href="qsqldatabase.html">QSqlDatabase</a> *oracle = QSqlDatabase::<a href="qsqldatabase.html#addDatabase">addDatabase</a>( DB_ORDERS_DRIVER, "ORACLE" );
if ( ! oracle ) {
<a href="qapplication.html#qWarning">qWarning</a>( "Failed to connect to oracle driver" );
return FALSE;
}
oracle-><a href="qsqldatabase.html#setDatabaseName">setDatabaseName</a>( DB_ORDERS_DBNAME );
oracle-><a href="qsqldatabase.html#setUserName">setUserName</a>( DB_ORDERS_USER );
oracle-><a href="qsqldatabase.html#setPassword">setPassword</a>( DB_ORDERS_PASSWD );
oracle-><a href="qsqldatabase.html#setHostName">setHostName</a>( DB_ORDERS_HOST );
if ( ! oracle-><a href="qsqldatabase.html#open">open</a>() ) {
<a href="qapplication.html#qWarning">qWarning</a>( "Failed to open orders database: " +
oracle-><a href="qsqldatabase.html#lastError">lastError</a>().driverText() );
<a href="qapplication.html#qWarning">qWarning</a>( oracle-><a href="qsqldatabase.html#lastError">lastError</a>().databaseText() );
return FALSE;
}
return TRUE;
}
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-create_connections-main-cpp.html">sql/overview/create_connections/main.cpp</a>
</em></p>
</blockquote><p> 在这个实例中我们打开了两个连接并加入了错误处理。静态函数<a href="qsqldatabase.html#database">QSqlDatabase::database</a>()可以在任何地方调用以获得一个数据库连接的指针。如果我们在调用此函数时未使用参数则返回默认连接,如果有参数则返回指定的连接,如上例中的“ORACLE”。
<p> 如果你使用<em>Qt设计器</em>来创建一个<tt>main.cpp</tt>,它将<em>不会</em>包含我们的实例createConnections()函数。这也就是说在<em>Qt设计器</em>中预览正确的应用程序将不会运行,除非你实现了你自己的数据库连接函数。
<p> 请注意以上的代码上ODBC连接没有被命名,因此被作为默认连接。<a href="qsqldatabase.html">QSqlDatabase</a>维护着通过addDatabase()这个静态函数返回的的连接指针。如果有移去一个连接,先调用<a href="qsqldatabase.html#close">QSqlDatabase::close</a>()来关闭连接,然后通过静态函数<a href="qsqldatabase.html#removeDatabase">QSqlDatabase::removeDatabase</a>()来移除连接。
<p> <a name="Executing_SQL_commands"></a>
<h2> 使用<a href="qsqlquery.html">QSqlQuery</a>执行SQL命令
</h2>
<a name="6"></a><p> <a href="qsqlquery.html">QSqlQuery</a>类提供了一个接口来执行SQL命令。它也提供相应的函数来定位<tt>SELECT</tt>查询的数据集和检索的不同的记录和字段值。
<p> <a href="qsqlcursor.html">QSqlCursor</a>类在下一节中讲述。它为我们提供了更高层的接口来实现SQL命令。<a href="qsqlcursor.html">QSqlCursor</a>特别适用于在屏幕上显示的可视窗口部件。不熟悉SQL的程序员可略过这一节,直接去阅读<a href="#Using_QSqlCursor">“使用 QSqlCursor”</a>来了解<a href="qsqlcursor.html">QSqlCursor</a>类。
<p> <a name="Transactions"></a>
<h3> 事务处理
</h3>
<a name="6-1"></a><p> 如果下面的数据库引擎支持事务处理,则函数<a href="qsqldriver.html#hasFeature">QSqlDriver::hasFeature</a>(QSqlDriver::Transactions)将返回 真。你可以通过调用<a href="qsqldatabase.html#transaction">QSqlDatabase::transaction</a>()来初始化一个事务处理。之后执行你想在该事务处理的工作。完了再执行<a href="qsqldatabase.html#commit">QSqlDatabase::commit</a>()来提交事务处理或<a href="qsqldatabase.html#rollback">QSqlDatabase::rollback</a>()取消事务处理。
<p> <a name="Basic_Browsing"></a>
<h3> 基本浏览
</h3>
<a name="6-2"></a><p>
<pre> #include <<a href="qapplication-h.html">qapplication.h</a>>
#include <<a href="qsqldatabase-h.html">qsqldatabase.h</a>>
#include <<a href="qsqlquery-h.html">qsqlquery.h</a>>
#include "../login.h"
bool createConnections();
int main( int argc, char *argv[] )
{
<a href="qapplication.html">QApplication</a> app( argc, argv );
if ( createConnections() ) {
<a name="x2155"></a> <a href="qsqldatabase.html">QSqlDatabase</a> *oracledb = QSqlDatabase::<a href="qsqldatabase.html#database">database</a>( "ORACLE" );
// 从oracle数据库向ODBC(默认)数据库复制数据
<a href="qsqlquery.html">QSqlQuery</a> target;
<a href="qsqlquery.html">QSqlQuery</a> query( "SELECT id, name FROM people;", oracledb );
<a name="x2157"></a> if ( query.<a href="qsqlquery.html#isActive">isActive</a>() ) {
<a name="x2158"></a> while ( query.<a href="qsqlquery.html#next">next</a>() ) {
<a name="x2156"></a> target.<a href="qsqlquery.html#exec">exec</a>( "INSERT INTO people ( id, name ) VALUES ( " +
<a name="x2159"></a> query.<a href="qsqlquery.html#value">value</a>(0).toString() +
", '" + query.<a href="qsqlquery.html#value">value</a>(1).toString() + "' );" );
}
}
}
return 0;
}
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-basicbrowsing-main-cpp.html">sql/overview/basicbrowsing/main.cpp</a>
</em></p>
</blockquote><p> 在以上实例中我们加入了一个头文件:<a href="qsqlquery-h.html">qsqlquery.h</a>. 我们使用缺省数据库创建了一个查询:<tt>target</tt>,其初始值是空的。我们使用“ORACLE”数据库创建了第二个查询以存取数据。数据连接的设置在createConnections()中完成。
<p> 在创建了一个<tt>SELECT</tt>语句后,函数isActive()被用来检测该命令是否被成功执行。之后的next()被用来遍历整个数据集。value()函数返回字段中的值,其数据类型为QVariants。插入操作通过先前就已创建的<tt>target</tt> <a href="qsqlquery.html">QSqlQuery</a>来完成。
<p> 注意这个实例和这份文档中所有的实例使用的表的定义都在<a href="#Example_Tables">实例表</a>中。
<p>
<pre> int count = 0;
<a name="x2161"></a> if ( query.<a href="qsqlquery.html#isActive">isActive</a>() ) {
<a name="x2162"></a> while ( query.<a href="qsqlquery.html#next">next</a>() ) {
<a name="x2160"></a> target.<a href="qsqlquery.html#exec">exec</a>( "INSERT INTO people ( id, name ) VALUES ( " +
<a name="x2164"></a> query.<a href="qsqlquery.html#value">value</a>(0).toString() +
", '" + query.<a href="qsqlquery.html#value">value</a>(1).toString() + "' );" );
if ( target.<a href="qsqlquery.html#isActive">isActive</a>() )
<a name="x2163"></a> count += target.<a href="qsqlquery.html#numRowsAffected">numRowsAffected</a>();
}
}
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-basicbrowsing2-main-cpp.html">sql/overview/basicbrowsing2/main.cpp</a>
</em></p>
</blockquote><p> 以上的代码来统计有多少记录被成功地插入数据库。如果操作,比如插入,失败则isActive()将返回假,如果记录行的数量不能被决定,比如查询失败,numRowsAffected()将返回-1。
<p> <a name="Basic_Data_Manipulation"></a>
<h3> 基本数据处理
</h3>
<a name="6-3"></a><p>
<pre> int main( int argc, char *argv[] )
{
<a href="qapplication.html">QApplication</a> app( argc, argv );
int rows = 0;
if ( createConnections() ) {
<a href="qsqlquery.html">QSqlQuery</a> query( "INSERT INTO staff ( id, forename, surname, salary ) "
"VALUES ( 1155, 'Ginger', 'Davis', 50000 );" );
<a name="x2167"></a><a name="x2166"></a> if ( query.<a href="qsqlquery.html#isActive">isActive</a>() ) rows += query.<a href="qsqlquery.html#numRowsAffected">numRowsAffected</a>() ;
<a name="x2165"></a> query.<a href="qsqlquery.html#exec">exec</a>( "UPDATE staff SET salary=60000 WHERE id=1155;" );
if ( query.<a href="qsqlquery.html#isActive">isActive</a>() ) rows += query.<a href="qsqlquery.html#numRowsAffected">numRowsAffected</a>() ;
query.<a href="qsqlquery.html#exec">exec</a>( "DELETE FROM staff WHERE id=1155;" );
if ( query.<a href="qsqlquery.html#isActive">isActive</a>() ) rows += query.<a href="qsqlquery.html#numRowsAffected">numRowsAffected</a>() ;
}
return ( rows == 3 ) ? 0 : 1;
}
</pre><blockquote><p align="center"><em> 来自<a href="sql-overview-basicdatamanip-main-cpp.html">sql/overview/basicdatamanip/main.cpp</a>
</em></p>
</blockquote><p> 这个实例演示了直接的SQL DML(数据操作语言)命令。既然我们没有在<a href="qsqlquery.html">QSqlQuery</a>的构造函数中指明数据库则默认数据库将被使用。<a href="qsqlquery.html">QSqlQuery</a>也可以用来执行SQL DDL(数据定义语言)命令,诸如<tt>CREATE</tt> TABLE与<tt>CREATE</tt> INDEX。
<p> <a name="Navigating_Result_Sets"></a>
<h3> 定位数据集
</h3>
<a name="6-4"></a><p> 一旦<tt>SELECT</tt>查询语句被成功执行,我们就可以存取与之对应的结果集。我们先前已使用了一个浏览函数:next()。它可以顺序扫描整个记录集。<a href="qsqlquery.html">QSqlQuery</a>同时也提供了first()、last()、next()和prev()。执行其中的任意一个函数后我们都可以通过isValid()来检验是否成功执行。
<p> 我们也可以通过seek()来定位至任意一条记录。第一条记录号为零。最后一条记录号为记录的总数减一。请注意并不时所有的数据都为<tt>SELECT</tt>查询提供记录总数这样的信息,此时size()将返回-1。
<p>
<pre> if ( createConnections() ) {
<a href="qsqlquery.html">QSqlQuery</a> query( "SELECT id, name FROM people ORDER BY name;" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -