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

📄 linux-unix

📁 QT 下载资料仅供参考
💻
📖 第 1 页 / 共 5 页
字号:
              <TR>
                <TD>SQL_C_SSHORT</TD>
                <TD>SQLSMALLINT</TD>
                <TD>short int</TD></TR>
              <TR>
                <TD>SQL_C_USHORT</TD>
                <TD>SQLUSMALLINT</TD>
                <TD>unsigned short int</TD></TR>
              <TR>
                <TD>SQL_C_SLONG</TD>
                <TD>SQLINTEGER</TD>
                <TD>long int</TD></TR>
              <TR>
                <TD>SQL_C_FLOAT</TD>
                <TD>SQLREAL</TD>
                <TD>float</TD></TR>
              <TR>
                <TD>SQL_C_DOUBLE</TD>
                <TD>SQLDOUBLE, SQLFLOAT</TD>
                <TD>double</TD></TR>
              <TR>
                <TD>SQL_C_BINARY</TD>
                <TD>SQLCHAR *</TD>
                <TD>unsigned char *</TD></TR>
              <TR>
                <TD>SQL_C_TYPE_DATE</TD>
                <TD>SQL_DATE_STRUCT</TD>
                <TD>struct tagDATE_STRUCT {SQLSMALLINT year; SQLUSMALLINT 
                  month; SQLUSMALLINT day; } DATE_STRUCT;</TD></TR>
              <TR>
                <TD>SQL_C_TYPE_TIME</TD>
                <TD>SQL_TIME_STRUCT</TD>
                <TD>struct tagTIME_STRUCT {SQLUSMALLINT hour; SQLUSMALLINT 
                  minute; SQLUSMALLINT second; } 
TIME_STRUCT;</TD></TR></TBODY></TABLE>
            <P>我们这里使用的数据库名称为test(DSN),这个DSN使用的用户名是root,密码为空,表的名称是web,字段情况如下:</P>
            <TABLE width="30%" border=1>
              <TBODY>
              <TR>
                <TD><B>字段名</B> </TD>
                <TD><B>数据类型</B> </TD></TR>
              <TR>
                <TD>id</TD>
                <TD>integer</TD></TR>
              <TR>
                <TD>name</TD>
                <TD>char(40)</TD></TR>
              <TR>
                <TD>size</TD>
                <TD>integer</TD></TR></TBODY></TABLE>
            <P>第一:设定ODBC环境句柄并设置参数 
            <BR>首先我们需要声明一个ODBC环境句柄(SQLHENV),它可以用来获得有关的ODBC环境信息,我们需要调用SQLAllocHandle 
            ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &amp;V_OD_Env 
            )来获得这个句柄,V_OD_Env就是要分配的SQLHENV类型的环境句柄。分配好句柄之后,你给它需要设定所使用的ODBC版本,你可以调用SQLSetEnvAttr 
            ( V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 
            ),SQL_ATTR_ODBC_VERSION是存放你定义的ODBC版本号的变量,SQL_OV_ODBC3则说明你的程序使用的是ODBC 
            3.0。 </P>
            <P>第二:设定连接句柄并设置超时参数 
            <BR>我们需要声明一个连接句柄(SQLHDBC),用来存放数据库连接信息的,调用SQLAllocHandle ( 
            SQL_HANDLE_DBC, V_OD_Env, &amp;V_OD_hdbc 
            )获得连接句柄,V_OD_hdbc就是要分配的SQLHDBC类型的连接句柄。分配好之后,我们可以调用SQLSetConnectAttr 
            ( V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0 )来设定连接超时参数。 </P>
            <P>第三:连接数据库 <BR>调用SQLConnect ( V_OD_hdbc, (SQLCHAR*) "Test", 
            SQL_NTS, (SQLCHAR*) "root", SQL_NTS, (SQLCHAR*) "", SQL_NTS 
            )连接我前面提到的数据库,需要设定三个参数,就是数据库名称、用户名和密码(因为我的数据库密码为空,所以这里的密码也为空),后面的SQL_NTS的位置应该写入这些参数的长度,如果写的是SQL_NTS就是让SQLConnect来决定参数的长度。 
            </P>
            <P>第四:分配SQL语句的句柄并进行查询: 
            <BR>需要声明一个SQL语句的句柄(SQLHSTMT),用来存放SQL语句信息的,调用SQLAllocHandle ( 
            SQL_HANDLE_STMT, V_OD_hdbc, &amp;V_OD_hstmt 
            )来获得这个句柄,V_OD_hstmt就是我们要分配的SQLHSTMT类型的SQL语句句柄。 </P>
            <P>我们的查询语句是:</P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>SELECT name, id FROM web ORDER BY id</PRE></TD></TR></TBODY></TABLE><BR>
            <P>执行这条查询语句之后,查询结果可能有很多行,但每行只有两列,分别对应name和id,它们的数据类型为integer和char*,在ODBC中的数据类型标识符为SQL_C_ULONG和SQL_C_CHAR。我们需要先声明这样的两个变量来存贮查询结果:</P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>SQLINTEGER		V_OD_id;
char		V_OD_buffer[200];
</PRE></TD></TR></TBODY></TABLE><BR>
            <P>然后我们需要使用SQLBindCol函数把查询结果和我们定义的变量进行绑定:</P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &amp;V_OD_buffer,150,&amp;V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&amp;V_OD_id,150,&amp;V_OD_err);
</PRE></TD></TR></TBODY></TABLE><BR>
            <P>这里的V_OD_err是用来存放错误信息编号的变量,类型也是SQLINTEGER。 
            <BR>接下来,我们调用SQLExecDirect来进行查询: </P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>SQLExecDirect ( V_OD_hstmt, "SELECT dtname,iduser FROM web order by iduser", SQL_NTS );</PRE></TD></TR></TBODY></TABLE><BR>
            <P>我们可以用SQLNumResultCols ( V_OD_hstmt, &amp;V_OD_colanz 
            )来获得结果的列数,也可以用SQLRowCount( V_OD_hstmt, &amp;V_OD_rowanz 
            )来获得结果的条数,V_OD_colanz和V_OD_rowanz分别存储相应的结果,类型分别为SQLSMALLINT和SQLINTEGER。 
            <BR>在读取结果之前,我们需要调用SQLFetch ( V_OD_hstmt 
            )语句,这个语句可以用来获得第一条结果也可以用来都下一条,有点像next的感觉。然后我们就可以在V_OD_id和V_OD_buffer里面获得每条记录的结果了。 
            </P>
            <P>第五:关于关闭连接和释放句柄 <BR>关闭数据库的连接,调用SQLDisconnect ( V_OD_hdbc 
            )就可以了,但在关闭数据库之前需要先释放SQL语句的句柄,而且在关闭数据库之后应该释放连接句柄和ODBC环境句柄,语句如下(按正常的顺序): 
            </P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
</PRE></TD></TR></TBODY></TABLE><BR>
            <P>第六:关于上述情况中的错误信息处理 <BR>我们需要定义两个变量: </P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>long	V_OD_erg;
SQLINTEGER	V_OD_err;</PRE></TD></TR></TBODY></TABLE><BR>
            <P>SQLAllocHandle、SQLSetEnvAttr、SQLSetConnectAttr、SQLConnect、SQLExecDirect、SQLNumResultCols和SQLRowCount的调用结果都可以用V_OD_erg来存储,V_OD_err可以获得SQLBindCol中的错误信息。</P>
            <P>第七:获得本机的DSN信息 
            <BR>我们可以在声明SQLHENV句柄之后,使用SQLDataSources函数来获得本机的DSN信息。程序如下: </P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>void OD_ListDSN(void)
{
char       l_dsn[100],l_desc[100];
short int  l_len1,l_len2,l_next;
l_next=SQL_FETCH_FIRST;
while( SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),
&amp;l_len1, l_desc, sizeof(l_desc), &amp;l_len2) == SQL_SUCCESS)
{
printf("Server=(%s) Beschreibung=(%s)\n",l_dsn,l_desc);
l_next=SQL_FETCH_NEXT;
}
}
</PRE></TD></TR></TBODY></TABLE><BR>
            <P>l_next变量是用来指定我们所要获得的DSN的类别:</P>
            <TABLE width="80%" border=1>
              <TBODY>
              <TR>
                <TD>SQL_FETCH_FIRST</TD>
                <TD>设定SQLDataSources()函数找到第一个可用的数据源(可以是User DSN,也可以是Systerm 
                  DSN)</TD></TR>
              <TR>
                <TD>SQL_FETCH_FIRST_USER</TD>
                <TD>设定SQLDataSources()函数找到第一个User DSN</TD></TR>
              <TR>
                <TD>SQL_FETCH_FIRST_SYSTEM</TD>
                <TD>设定SQLDataSources()函数找到第一个System DSN</TD></TR>
              <TR>
                <TD>SQL_FETCH_NEXT</TD>
                <TD>找到下一个数据源,至于数据源类型则要根据前面的定义</TD></TR></TBODY></TABLE>
            <P>到这里,我们在Unix的C语言下面进行ODBC编程已经讲完,上述ODBC 
            API需要引用以下几个头文件(这些文件已经安装到/usr/include下了):</P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>#include &lt;sql.h&gt;
#include &lt;sqlext.h&gt;
#include &lt;sqltypes.h&gt;</PRE></TD></TR></TBODY></TABLE><BR>
            <P>另外如果大家使用GTK进行编程,由于到目前为止GTK还没有加入专门处理数据库的部件,所以大家可以在GTK中调用上述的ODBC 
            API即可。</P>
            <P>这里附上例程供大家参考学习:</P>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=code-outline><PRE class=displaycode>/* odbc.c
    testing unixODBC
*/
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;odbc/sql.h&gt;
#include &lt;odbc/sqlext.h&gt;
#include &lt;odbc/sqltypes.h&gt;
SQLHENV			 V_OD_Env;			// Handle ODBC environment
long			 V_OD_erg;			// result of functions
SQLHDBC			 V_OD_hdbc;			// Handle connection
char			 V_OD_stat[10];		// Status SQL
SQLINTEGER		 V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT		 V_OD_mlen,V_OD_colanz;
char             V_OD_msg[200],V_OD_buffer[200];
int main(int argc,char *argv[])
{
	// 1. allocate Environment handle and register version 
	V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&amp;V_OD_Env);
	if ((V_OD_erg != SQL_SUCCESS) &amp;&amp; (V_OD_erg != SQL_SUCCESS_WITH_INFO))
	{
		printf("Error AllocHandle\n");
		exit(0);
	}
	V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
	if ((V_OD_erg != SQL_SUCCESS) &amp;&amp; (V_OD_erg != SQL_SUCCESS_WITH_INFO))
	{
		printf("Error SetEnv\n");
		SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
		exit(0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -