⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sql.html

📁 这是qt3的帮助文档的中文版
💻 HTML
📖 第 1 页 / 共 5 页
字号:

        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 &lt;<a href="qapplication-h.html">qapplication.h</a>&gt;
    #include &lt;<a href="qsqldatabase-h.html">qsqldatabase.h</a>&gt;
    #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-&gt;<a href="qsqldatabase.html#setDatabaseName">setDatabaseName</a>( DB_SALES_DBNAME );
    <a name="x2154"></a>    defaultDB-&gt;<a href="qsqldatabase.html#setUserName">setUserName</a>( DB_SALES_USER );
    <a name="x2153"></a>    defaultDB-&gt;<a href="qsqldatabase.html#setPassword">setPassword</a>( DB_SALES_PASSWD );
    <a name="x2152"></a>    defaultDB-&gt;<a href="qsqldatabase.html#setHostName">setHostName</a>( DB_SALES_HOST );
    <a name="x2150"></a>    if ( ! defaultDB-&gt;<a href="qsqldatabase.html#open">open</a>() ) {
            <a href="qapplication.html#qWarning">qWarning</a>( "Failed to open sales database: " +
    <a name="x2149"></a>                  defaultDB-&gt;<a href="qsqldatabase.html#lastError">lastError</a>().driverText() );
            <a href="qapplication.html#qWarning">qWarning</a>( defaultDB-&gt;<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-&gt;<a href="qsqldatabase.html#setDatabaseName">setDatabaseName</a>( DB_ORDERS_DBNAME );
        oracle-&gt;<a href="qsqldatabase.html#setUserName">setUserName</a>( DB_ORDERS_USER );
        oracle-&gt;<a href="qsqldatabase.html#setPassword">setPassword</a>( DB_ORDERS_PASSWD );
        oracle-&gt;<a href="qsqldatabase.html#setHostName">setHostName</a>( DB_ORDERS_HOST );
        if ( ! oracle-&gt;<a href="qsqldatabase.html#open">open</a>() ) {
            <a href="qapplication.html#qWarning">qWarning</a>( "Failed to open orders database: " +
                      oracle-&gt;<a href="qsqldatabase.html#lastError">lastError</a>().driverText() );
            <a href="qapplication.html#qWarning">qWarning</a>( oracle-&gt;<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 &lt;<a href="qapplication-h.html">qapplication.h</a>&gt;
    #include &lt;<a href="qsqldatabase-h.html">qsqldatabase.h</a>&gt;
    #include &lt;<a href="qsqlquery-h.html">qsqlquery.h</a>&gt;
    #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 + -