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

📄 appbuilder中进行直接odbc api数据库调用访问的基本方法.htm

📁 数据库编程技巧文章
💻 HTM
📖 第 1 页 / 共 2 页
字号:
http://www.csdn.net/develop/library/vc/datebase/290.shtm
'>
AppBuilder中进行直接ODBC API数据库调用访问的基本方法!
</a>
</TD></tr>
<TR>
<TD align=left   width=300>
<B>关键字:</B><BR>
AppBuilder中进行直接ODBC API数据库调用访问的基本方法!
</TD>
<TD align=middle   width=120>
<B>贴文时间</B><br>
2000-8-7 10:22:22
</TD>
<TD align=middle   width=80>
<B>文章类型: </B><BR>
转贴
</TD>
<TD align=middle   width=100>
<B>给贴子投票 </B>
<BR><a href='http://www.csdn.net/develop/addscore.asp?id=
290
'>投票</a>
</TD></TR>
<TR>
<TD >
&nbsp;
ucancode
&nbsp;&nbsp;
转贴
</TD>
<TD   colSpan=3 vAlign=top>
<B>出处: </B><A href='
http://www.ucancode.com/jiaocheng/index.htm
'>
http://www.ucancode.com/jiaocheng/index.htm
</A></TD></TR>
<TR><TD  colSpan=5 bgcolor=#cccc99>&nbsp;</TD></TR>
</TD></TR></TBODY></TABLE>
<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<br><br>作者:张修勇&nbsp; appbuilder的网址:http://www.ucancode.com<br><br>第一章:如何为你的开发系统配置dsn:<br><br>(一)、打开windows的控制面板。选择odbc data sources图标,双击打开此图标内容,此时出现odbc data source administrator对话框。<br><br> <br><br>(2)、在对话框中选择user dsn然后你可以选择&lt;添加&gt;按钮来新增一个dsn.<br><br> <br><br>第二章:如何利用odbc api在vc下面直接编写基于数据库的程序:<br><br>odbc数据库编程<br>一、 一般步骤: <br><br>分配环境 <br><br>应用系统在调用任何odbc函数之前,首先必须初始化odbc,并建立一个环境。<br>odbc用该环境监视应用系统已经建立的数据库连接。每个应用系统只建立一个<br>环境是很有必要的,因为不管有多少连接都可以在一个环境中建立。完成这一分<br>配过程的odbc函数sqlallocenv在下一小节描述。<br><br>sqlallocenv<br>sqlallocenv为环境句柄分配内存,并初始化应用系统使用的odbc调用层接口。<br>应用系统在调用任何其他odbc函数之前必须调用sqlallocenv。<br>以下是sqlallocenv的语法:<br>retcode sqlallocenv(phenv)<br>sqlallocenv的参数如下表所示,其返回码是sql-error。因为调用sqlerror<br>时无有效句柄,所以该函数没有sqlstate返回码; <br>//分配环境句柄<br>sqlreturn m_retcode;<br>if( m_henv != sql_null_henv )<br>return false;<br>if (sql_success == (m_retcode = sqlallocenv( &amp;m_henv )))<br>{<br>//创建新的dsn<br>createdsn(ids_home_dsnname,ids_home_dbfilename);<br>//分配连接句柄<br>if (sql_success == (m_retcode = sqlallocconnect( m_henv, &amp;m_hdbc )))<br>{<br>// 连接数据源<br>if (sql_success == (m_retcode = sqlconnect( m_hdbc, (uchar *)((lpctstr)m_strdsn), sql_nts, null, 0, null, 0 )))<br>{<br>m_bconnected = true;<br>}<br>}<br>}<br>分配连接句柄<br><br>就象应用系统的环境由环境句柄代表一样,连接句柄代表应用系统与数据源<br>之间的连接。对于应用系统所要连接的每一个数据源而言,都必须分配一个连接<br>句柄。例如,如果需要同时与dbase和btrieve的数据源连接,必须分配两个连接<br>句柄。下一小节描述函数sqlallocconnect.<br><br>sqlallocconnect在henv标识的环境里为连接句柄分配内存。以下是<br>sqlallocconnect的语法:<br>retcode sqlallocconnect(henv,phdbc)<br>sqlallocconnect 的参数如下表所示,其返回码是:<br>sql-success<br>sql-success-with-info<br>sql-error<br>sql-invalid-handle<br>sqlstate的返回码是:<br>01000 s1000 s1001 s1009<br>利用核心函数与数据源连接<br><br>尽管有很多odbc函数可以建立连接,但在核心api层却只有一种,即函数<br>sqlconnect。它提供简单、有效的方法与数据源的连接。所有驱动程序都支持<br>sqlconnect,所以它是最具有互用性的解决方案。下面是sqlconnect的描述。<br><br>sqlconnect加载一个数据库驱动程序,并建立一个与数据源的连接。该连接<br>句柄确定所有连接信息(包括它的状态,事务状态和错误信息)的存储位置。<br><br>sqlconnect的语法如下:<br>retcode sqlconnect(hdbc,szdsn,cbdsn,szuid,cbuid,szauthstr,cbauthatr)<br><br>sqlconnectde的返回码是:<br>sql-success<br>sql-success-with-info<br>sql-error<br>sql-invalid-number<br><br><br>与数据源断开<br><br>应用系统一旦使用完成一个数据源连接,便应与之断开。连接是十分昂贵<br>的资源,因为很多dbms对同时连接的每一个许可人员或用户都是收费的。当<br>连接完成时,应当把它返回,以便其它用户能注册进入该系统。下面描述的odbc<br>函数sqldisconnect处理这一操作过程。<br><br>sqldisconnect关闭与指定的连接句柄相关的数据源连接。sqldisconnect<br>的语法如下:<br>retcodesqldisconnect(hdbc)<br>sqldisconnect的返回码是:<br>sql-success<br>sql-success-with-info<br>sql-error<br>sql-invalid-handle <br><br>如果数据源连接成功的话,就可以继续下一步;<br>cstring strsqlstring;<br>retcode returncode;<br>sqlhstmthstmt;<br>if (sql_success != sqlallochandle(sql_handle_stmt,theapp.m_hdbc,&amp;hstmt))<br>return;<br>strsqlstring.format(<br>&quot;select &quot;<br>&quot;nid,&quot;<br>&quot;ariqi,&quot;<br>&quot;njine,&quot;<br>&quot;ashuoming,&quot;<br>&quot;alaiyuan,&quot;<br>&quot;acunzhe,&quot;<br>&quot;ayongtu,&quot;<br>&quot;axiaofei,&quot;<br>&quot;abeizhu&quot;<br>&quot; from hhzhichu &quot;<br>&quot; where nid=%u&quot;,<br>nid);<br>if (sql_success == (returncode = sqlexecdirect(hstmt,(uchar*)((lpctstr)strsqlstring),sql_nts)))<br>{<br>sqlbindcol(hstmt,1,sql_c_slong,&amp;dbdata.m_nid,0,&amp;cb);<br>sqlbindcol(hstmt,2,sql_c_timestamp,&amp;dbdata.m_ariqi,0,&amp;cb);<br>sqlbindcol(hstmt,3,sql_c_double,&amp;dbdata.m_njine,0,&amp;cb);<br>sqlbindcol(hstmt,4,sql_c_char,dbdata.m_ashuoming,hhzhichu_ashuoming_size,&amp;cb);<br>sqlbindcol(hstmt,5,sql_c_char,dbdata.m_alaiyuan,hhzhichu_alaiyuan_size,&amp;cb);<br>sqlbindcol(hstmt,6,sql_c_char,dbdata.m_acunzhe,hhzhichu_acunzhe_size,&amp;cb);<br>sqlbindcol(hstmt,7,sql_c_char,dbdata.m_ayongtu,hhzhichu_ayongtu_size,&amp;cb);<br>sqlbindcol(hstmt,8,sql_c_char,dbdata.m_axiaofei,hhzhichu_axiaofei_size,&amp;cb);<br>sqlbindcol(hstmt,9,sql_c_char,dbdata.m_abeizhu,hhzhichu_abeizhu_size,&amp;cb);<br>if (sql_success == (returncode = sqlfetch(hstmt)))<br>{<br>//读数据成功,可一对数据进行处理了。<br>}<br>}<br>::sqlfreehandle(sql_handle_stmt,hstmt);<br><br><br>程序完了后要关闭数据库,<br>//断开连接<br>if (m_bconnected)<br>{<br>sqldisconnect(m_hdbc);<br>sqlfreehandle(sql_handle_dbc,m_hdbc);<br>m_hdbc = null;<br>}<br>//删除dsn<br>if (founddsnname(ids_home_dsnname))<br>deletedsn(ids_home_dsnname);<br>//删除环境句柄<br>if (m_henv)<br>{<br>sqlfreehandle(sql_handle_env,m_henv);<br>m_henv = null;<br>}<br><br>二、 针对数据库的操作<br>以下的方法只对access数据库有效,<br>1、 生成数据库<br>cstring strfilename=&quot;c:\1.mdb&quot;;<br>cstring strdriver;<br>char szfilename[100+_max_path];<br>strdriver = &quot;microsoft access driver (*.mdb)\0&quot;;<br>sprintf(szfilename,&quot;create_db=%s general\0\0&quot;,strfilename);<br>sqlconfigdatasource(null,odbc_add_dsn,strdriver,szfilename);<br>2、 压缩数据库<br>bool superdatabase::compaction(cstring strsourname, cstring strdestname)<br>{<br>if (strsourname.isempty())<br>return false;<br>if (strdestname.isempty())<br>strdestname = strsourname;<br>char szcommand[100+_max_path];<br>int j;<br>cstring strdriver;<br>strdriver = &quot;microsoft access driver (*.mdb)\0&quot;;<br>j = sprintf(szcommand,&quot;compact_db=%s %s general\0\0&quot;,strsourname,strdestname);<br>return sqlconfigdatasource(null,odbc_add_dsn,strdriver,szcommand);<br>}<br>3、 取得数据库的名称:<br>如果已经打开了一个数据源,可以通过数据源来取得当前的数据库的名称;<br>cstring superdatabase::getdatabasename()<br>{<br>assert(m_hdbc != sql_null_hdbc);<br>char szname[max_tname_len];<br>sword nresult;<br>sqlgetinfo(m_hdbc, sql_database_name,<br>szname, max_tname_len, &amp;nresult);<br>return szname;<br>}<br><br>三、 针对数据源的操作:<br>1、 增加数据源<br>bool superdatabase::createdsn(cstring strdriver, cstring strfilename,cstring strdsn, cstring struserid, cstring strpwd)<br>{<br>char szattr[100+_max_path];<br>int j;<br>if (strdriver.isempty())<br>strdriver = &quot;microsoft access driver (*.mdb)\0&quot;;<br>j = sprintf(szattr,&quot;dsn=%s\0&quot;,strdsn);<br>j++;<br>j = sprintf(szattr+j,&quot;dbq=%s\0\0 &quot;,strfilename);<br>return sqlconfigdatasource(null,odbc_add_dsn,strdriver,szattr);<br>}<br>2、 删除数据源<br>void superdatabase::removedsn(cstring strdsn)<br>{<br>char szdsn[255];<br>sprintf(szdsn,&quot;dsn=%s\0\0&quot;,strdsn);<br>bool bissuccess = sqlconfigdatasource(null,odbc_remove_dsn,&quot;microsoft access driver (*.mdb)\0&quot;,szdsn);<br>}<br>3、 取得系统已有得dsn<br>sword ndatasourcenamelength; //dsn str length<br>sword nsourcedescriptionlength; //driver description str length<br>char szsourcedescription[maxbuflen+1]; //driver description string<br>sqlreturn nresult; //return code<br>sword ndirection=sql_fetch_first;<br>if ((nresult = sqldatasources(m_henv, ndirection, (uchar *)((lpctstr)strdatasourcename), maxbuflen, &amp;ndatasourcenamelength, (uchar *)szsourcedescription, maxbuflen, &amp;nsourcedescriptionlength)) != sql_no_data &amp;&amp; nresult != sql_error)<br>{<br>ndirection=sql_fetch_next;<br>// szsourcedescription为dsn 的描述,可以在这里取来用;<br>}<br><br>四、 针对表的操作:<br>1、 取得表名:<br>void superdatabase::gettable(cstringlist &amp;tablelist)<br>{<br>assert(m_bisconnect);<br>if (!m_bisconnect)<br>return;<br>sqlhstmt hstmt = null;<br>if (sql_success == ::sqlallochandle(sql_handle_stmt, m_hdbc, &amp;hstmt))<br>{<br>if (sql_success == ::sqltables(hstmt, null, 0, null, 0,<br>null, 0, null, 0))<br>{<br>sdword cb;<br>char sztable[255];<br>char sztabletype[255];<br>::sqlbindcol(hstmt, 3, sql_c_char, sztable, 255, &amp;cb);<br>::sqlbindcol(hstmt, 4, sql_c_char, sztabletype, 255, &amp;cb);<br>while (sql_success == ::sqlfetch(hstmt))<br>{<br>if (0 == strcmp(sztabletype, &quot;table&quot;))//table表示表,view表示查询<br>{<br>tablelist.addtail(sztable);<br>}<br>}<br>}<br>}<br>::sqlfreehandle(sql_handle_stmt, hstmt);<br>hstmt = null;<br>}<br>2、 创建表:可以用sql语句生成表,使用的命令为:&quot;create table&quot;:<br>create table table (field1 type [(size)] [not null] [index1] [, field2 type [(size)] [not null] [index2] [, ...]] [, constraint multifieldindex [, ...]]) 其中,各类型type如下:<br>数据类型 type参数<br>整型 short<br>长整型 integer<br>单精度 float<br>双精度 double<br>字符串 text<br>日期 datetime<br>是/否 bit<br>货币 currency<br>系统自动编号 counter<br><br>五、 对列的操作:<br>1、 取得sql语句中的列数:<br>int superrecordset::getcolcount()<br>{<br>sword swcolcount;<br>if (m_hstmt == null)<br>return -1;<br>if (sql_success == ::sqlnumresultcols(m_hstmt,&amp;swcolcount))<br>return swcolcount;<br>else<br>return -1;<br>}<br><br>七、数据的读取<br>1、列绑定:<br>cstring strsqlstring;<br>retcode returncode;<br>sqlhstmt hstmt;<br>if (sql_success != sqlallochandle(sql_handle_stmt,theapp.m_hdbc,&amp;hstmt))<br>return;<br>ff_db_hhzhichu_set_fields dbdata;<br>sdword cb1;<br>sdword cb2;<br>sdword cb3;<br>sdword cb4;<br>sdword cb5;<br>sdword cb6;<br>sdword cb7;<br>sdword cb8;<br>sdword cb9;<br><br>// build the sql statement<br>strsqlstring.format(<br>&quot;select &quot;<br>&quot;nid,&quot;<br>&quot;ariqi,&quot;<br>&quot;njine,&quot;<br>&quot;ashuoming,&quot;<br>&quot;alaiyuan,&quot;<br>&quot;acunzhe,&quot;<br>&quot;ayongtu,&quot;<br>&quot;axiaofei,&quot;<br>&quot;abeizhu&quot;<br>&quot; from hhzhichu &quot;<br>&quot; where nid=%u&quot;,<br>nid);<br><br>if (sql_success == (returncode = sqlexecdirect(hstmt,(uchar*)((lpctstr)strsqlstring),sql_nts)))<br>{<br>sqlbindcol(hstmt,1,sql_c_slong,&amp;dbdata.m_nid,0,&amp;cb1);<br>sqlbindcol(hstmt,2,sql_c_timestamp,&amp;dbdata.m_ariqi,0,&amp;cb2);<br>sqlbindcol(hstmt,3,sql_c_double,&amp;dbdata.m_njine,0,&amp;cb3);<br>sqlbindcol(hstmt,4,sql_c_char,dbdata.m_ashuoming,hhzhichu_ashuoming_size,&amp;cb4);<br>sqlbindcol(hstmt,5,sql_c_char,dbdata.m_alaiyuan,hhzhichu_alaiyuan_size,&amp;cb5);<br>sqlbindcol(hstmt,6,sql_c_char,dbdata.m_acunzhe,hhzhichu_acunzhe_size,&amp;cb6);<br>sqlbindcol(hstmt,7,sql_c_char,dbdata.m_ayongtu,hhzhichu_ayongtu_size,&amp;cb7);<br>sqlbindcol(hstmt,8,sql_c_char,dbdata.m_axiaofei,hhzhichu_axiaofei_size,&amp;cb8);<br>sqlbindcol(hstmt,9,sql_c_char,dbdata.m_abeizhu,hhzhichu_abeizhu_size,&amp;cb9);<br><br><br>// fetch and store...<br>if (sql_success == (returncode = sqlfetch(hstmt)))<br>{<br>m_record.m_nid = dbdata.m_nid;<br><br>m_record.m_ariqi.setdatetime(dbdata.m_ariqi.year,<br>dbdata.m_ariqi.month,<br>dbdata.m_ariqi.day,<br>dbdata.m_ariqi.hour,<br>dbdata.m_ariqi.minute,<br>dbdata.m_ariqi.second);<br><br>m_record.m_njine = dbdata.m_njine;<br>m_record.m_ashuoming = dbdata.m_ashuoming;<br>m_record.m_alaiyuan = dbdata.m_alaiyuan;<br>m_record.m_acunzhe = dbdata.m_acunzhe;<br>m_record.m_ayongtu = dbdata.m_ayongtu;<br>m_record.m_axiaofei = dbdata.m_axiaofei;<br>m_record.m_abeizhu = dbdata.m_abeizhu;<br><br>}<br>}<br>::sqlfreehandle(sql_handle_stmt,hstmt);<br><br>其中,如果cb1、cb2、cb3、cb4、cb5、cb6、cb7、cb8、cb9是接受返回的数据的大小的,如果他们的值等于sql_null_data,那么表示此记录的这个字段的值为空。<br><br>2、块绑定<br>cstuffbasicdataqry::cstuffbasicdataqry(codbcdatabase* pdb) : m_nrowsetsize(1000), m_pdatabase(pdb)<br>{<br>m_hstmt = sql_null_hstmt;<br>retcode returncode = sqlallochandle(sql_handle_stmt, m_pdatabase-&gt;gethdbc(), &amp;m_hstmt);<br>if (returncode != sql_success)<br>trace(&quot;unable to allocate statement handle in cttttempset\n&quot;);<br>}<br><br>cstuffbasicdataqry::~cstuffbasicdataqry()<br>{<br>reset();<br>if (m_hstmt)<br>sqlfreehandle(sql_handle_stmt, m_hstmt);<br>}<br>void cstuffbasicdataqry::reset()<br>{<br>if (m_hstmt)<br>sqlfreehandle(sql_handle_stmt, m_hstmt);<br>for (int i = 0; i &lt; m_adata.getsize(); i++)<br>delete m_adata.getat(i);<br>m_adata.removeall();<br>}<br>int cstuffbasicdataqry::load()<br>{<br>cstring strsqlstring;<br>//retcode returncode;<br>udword rowsfetched;<br>uword *prowstatus;<br>pff_db_stuffbasicdataqry_fields phostdata;<br><br>assert(m_nrowsetsize &gt; 0);<br>prowstatus = new uword[m_nrowsetsize];<br>assert(prowstatus);<br>phostdata = new ff_db_stuffbasicdataqry_fields[m_nrowsetsize];<br>assert(phostdata);<br><br>sqlsetstmtoption(m_hstmt,sql_bind_type,sizeof(ff_db_stuffbasicdataqry_fields));<br>sqlsetstmtoption(m_hstmt,sql_concurrency,sql_concur_read_only);<br>sqlsetstmtoption(m_hstmt,sql_cursor_type,sql_cursor_keyset_driven);<br>sqlsetstmtoption(m_hstmt,sql_rowset_size,m_nrowsetsize);<br><br>strsqlstring.format(<br>&quot;select * &quot;<br>&quot; from stuffbasicdata&quot;);<br><br>if (sql_success == sqlexecdirect(m_hstmt,(uchar*)((lpctstr)strsqlstring),sql_nts))<br>{<br>sqlbindcol(m_hstmt,1,sql_c_char,phostdata[0].m_astuffid,stuffbasicdataqry_astuffid_size,&amp;phostdata[0].m_astuffidind);<br>sqlbindcol(m_hstmt,2,sql_c_char,phostdata[0].m_anamecn,stuffbasicdataqry_anamecn_size,&amp;phostdata[0].m_anamecnind);<br>sqlbindcol(m_hstmt,3,sql_c_char,phostdata[0].m_anameen,stuffbasicdataqry_anameen_size,&amp;phostdata[0].m_anameenind);<br>sqlbindcol(m_hstmt,4,sql_c_char,phostdata[0].m_aeducation,stuffbasicdataqry_aeducation_size,&amp;phostdata[0].m_aeducationind);<br>sqlbindcol(m_hstmt,5,sql_c_char,phostdata[0].m_agender,stuffbasicdataqry_agender_size,&amp;phostdata[0].m_agenderind);<br>sqlbindcol(m_hstmt,6,sql_c_timestamp,&amp;phostdata[0].m_dworkdate,0,&amp;phostdata[0].m_dworkdateind);<br>sqlbindcol(m_hstmt,7,sql_c_char,phostdata[0].m_adepartment,stuffbasicdataqry_adepartment_size,&amp;phostdata[0].m_adepartmentind);<br>sqlbindcol(m_hstmt,8,sql_c_char,phostdata[0].m_abusiness,stuffbasicdataqry_abusiness_size,&amp;phostdata[0].m_abusinessind);<br>sqlbindcol(m_hstmt,9,sql_c_char,phostdata[0].m_abusinesslevel,stuffbasicdataqry_abusinesslevel_size,&amp;phostdata[0].m_abusinesslevelind);<br>sqlbindcol(m_hstmt,10,sql_c_char,phostdata[0].m_aworktype,stuffbasicdataqry_aworktype_size,&amp;phostdata[0].m_aworktypeind);<br>sqlbindcol(m_hstmt,11,sql_c_timestamp,&amp;phostdata[0].m_dleaveworkdate,0,&amp;phostdata[0].m_dleaveworkdateind);<br>sqlbindcol(m_hstmt,12,sql_c_char,phostdata[0].m_aenagetype,stuffbasicdataqry_aenagetype_size,&amp;phostdata[0].m_aenagetypeind);<br>sqlbindcol(m_hstmt,13,sql_c_timestamp,&amp;phostdata[0].m_dcreatedocdate,0,&amp;phostdata[0].m_dcreatedocdateind);<br><br>while (sql_success == sqlextendedfetch(m_hstmt,sql_fetch_next,1,&amp;rowsfetched,prowstatus))<br>{<br>for (uint count = 0; count &lt; rowsfetched; count++)<br>{<br>if (prowstatus[count] != sql_row_deleted &amp;&amp; prowstatus[count] != sql_row_error )<br>{<br>pdb_stuffbasicdataqry_fields pdata = new db_stuffbasicdataqry_fields();<br>assert(pdata);<br><br>if (phostdata[count].m_astuffidind == sql_null_data)<br>pdata-&gt;m_astuffid = &quot;&quot;;<br>else<br>pdata-&gt;m_astuffid = phostdata[count].m_astuffid;<br>if (phostdata[count].m_anamecnind == sql_null_data)<br>pdata-&gt;m_anamecn = &quot;&quot;;<br>else<br>pdata-&gt;m_anamecn = phostdata[count].m_anamecn;<br>if (phostdata[count].m_anameenind == sql_null_data)<br>pdata-&gt;m_anameen = &quot;&quot;;<br>else<br>pdata-&gt;m_anameen = phostdata[count].m_anameen;<br>if (phostdata[count].m_aeducationind == sql_null_data)<br>pdata-&gt;m_aeducation = &quot;&quot;;<br>else<br>pdata-&gt;m_aeducation = phostdata[count].m_aeducation;<br>if (phostdata[count].m_agenderind == sql_null_data)<br>pdata-&gt;m_agender = &quot;&quot;;<br>else<br>pdata-&gt;m_agender = phostdata[count].m_agender;<br>pdata-&gt;m_dworkdate.setdatetime(phostdata[count].m_dworkdate.year,<br>phostdata[count].m_dworkdate.month,<br>phostdata[count].m_dworkdate.day,<br>phostdata[count].m_dworkdate.hour,<br>phostdata[count].m_dworkdate.minute,<br>phostdata[count].m_dworkdate.second);<br>if (phostdata[count].m_adepartmentind == sql_null_data)<br>pdata-&gt;m_adepartment = &quot;&quot;;<br>else<br>pdata-&gt;m_adepartment = phostdata[count].m_adepartment;<br>if (phostdata[count].m_abusinessind == sql_null_data)<br>pdata-&gt;m_abusiness = &quot;&quot;;<br>else<br>pdata-&gt;m_abusiness = phostdata[count].m_abusiness;<br>if (phostdata[count].m_abusinesslevelind == sql_null_data)<br>pdata-&gt;m_abusinesslevel = &quot;&quot;;<br>else<br>pdata-&gt;m_abusinesslevel = phostdata[count].m_abusinesslevel;<br>if (phostdata[count].m_aworktypeind == sql_null_data)<br>pdata-&gt;m_aworktype = &quot;&quot;;<br>else<br>pdata-&gt;m_aworktype = phostdata[count].m_aworktype;<br>pdata-&gt;m_dleaveworkdate.setdatetime(phostdata[count].m_dleaveworkdate.year,<br>phostdata[count].m_dleaveworkdate.month,<br>phostdata[count].m_dleaveworkdate.day,<br>phostdata[count].m_dleaveworkdate.hour,<br>phostdata[count].m_dleaveworkdate.minute,<br>phostdata[count].m_dleaveworkdate.second);<br>if (phostdata[count].m_aenagetypeind == sql_null_data)<br>pdata-&gt;m_aenagetype = &quot;&quot;;<br>else<br>pdata-&gt;m_aenagetype = phostdata[count].m_aenagetype;<br>pdata-&gt;m_dcreatedocdate.setdatetime(phostdata[count].m_dcreatedocdate.year,<br>phostdata[count].m_dcreatedocdate.month,<br>phostdata[count].m_dcreatedocdate.day,<br>phostdata[count].m_dcreatedocdate.hour,<br>phostdata[count].m_dcreatedocdate.minute,<br>phostdata[count].m_dcreatedocdate.second);<br><br>m_adata.add(pdata);<br>}<br>}<br>if (rowsfetched &lt; (uint)m_nrowsetsize)<br>break;<br>}<br>}<br>delete [] prowstatus;<br>delete [] phostdata;<br>return m_adata.getsize();<br>}<br><br>八、写数据库<br>1、普通方法:<br>cstring strsql=&quot;insert into table (file1,file2,file3) values (value1,value2,value3)&quot;<br><br>long executesql(sqlhdbc hdbc,cstring strsql)<br>{<br>sqlreturn returncode;<br>sqlhstmt m_hstmt;<br>bool breturn = false;<br>long nrowcount = 0;<br>if (sql_success == (returncode = ::sqlallochandle(sql_handle_stmt,hdbc,&amp;m_hstmt)))<br>{<br>if (sql_success == (returncode = ::sqlexecdirect(m_hstmt, (uchar*)((lpctstr)strsql),sql_nts)))<br>{<br>breturn = true;<br>::sqlrowcount(m_hstmt,&amp;nrowcount);<br>}<br>}<br>returncode = ::sqlfreehandle(sql_handle_stmt,m_hstmt);<br><br>// if (!breturn) nrowcount = 0;<br>return nrowcount;<br>}<br>注意,要把字段赋为空,字符串、日期应是null,可以用下面的函数修改:<br>cstring verifysqlstr(cstring strsql)<br>{<br>int nlength = strsql.getlength();<br>int n1 = 0;//check '';<br>int n2 = 0;<br>int m1 = 0;//check ##;<br>int m2 = 0;<br>for (int i = 0; i&lt; nlength;i++)<br>{<br>if (strsql[i] == 39)<br>{<br>n2 = i;<br>if (n2-n1 == 1)<br>{<br>strsql.delete(n1,2);<br>strsql.insert(n1,&quot;null&quot;);<br>nlength +=2;<br>n1 = n2;<br>}<br>else<br>{<br>n1 = n2;<br>}<br>}<br>if (strsql[i] == '#')<br>{<br>m2 = i;<br>if (m2-m1 == 1)<br>{<br>strsql.delete(m1,2);<br>strsql.insert(m1,&quot;null&quot;);<br>nlength +=2;<br>m1 = m2;<br>}<br>else<br>{<br>m1 = m2;<br>}<br>}<br>}<br>return strsql;<br>}<br><br>2、参数绑定:<br>bool ccddataset::insert(pdb_cddata_set_fields pdata, bool bfirsttime /* true */)<br>{<br>retcode returncode;<br>cstring strsqlstring;<br>static ff_db_cddata_set_fields hostdata;<br><br><br>// prepare the statement and bind the columns once<br>if (bfirsttime)<br>{<br>memset(&amp;hostdata,0,sizeof(hostdata));<br>sqlfreestmt(m_hstmt, sql_close); // close the cursor if any<br>sqlfreestmt(m_hstmt, sql_reset_params); // reset the statement handle<br>strsqlstring.format(&quot;insert into cddata (&quot;<br>&quot;nguangpan,&quot;<br>&quot;nwenjian,&quot;<br>&quot;nclass,&quot;<br>&quot;awenjian,&quot;<br>&quot;nshangji,&quot;<br>&quot;nshuxing,&quot;<br>&quot;abeizhu )&quot;<br>&quot;values (&quot;<br>&quot;?,&quot; // nguangpan<br>&quot;?,&quot; // nwenjian<br>&quot;?,&quot; // nclass<br>&quot;?,&quot; // awenjian<br>&quot;?,&quot; // nshangji<br>&quot;?,&quot; // nshuxing<br>&quot;? )&quot; // abeizhu<br>); // end format<br><br>returncode = sqlprepare(m_hstmt, (uchar*)((lpctstr)strsqlstring),sql_nts);<br>if (returncode != sql_success)<br>{<br>return false;<br>}<br><br>sqlbindparameter(m_hstmt,1, sql_param_input, sql_c_slong, sql_integer, 0,<br>0,&amp;hostdata.m_nguangpan,0,&amp;hostdata.m_nguangpanind );<br>sqlbindparameter(m_hstmt, 2,sql_param_input,sql_c_slong,sql_integer, 0,<br>0,&amp;hostdata.m_nwenjian,0, &amp;hostdata.m_nwenjianind );<br>sqlbindparameter(m_hstmt,3,sql_param_input, sql_c_slong,sql_integer, 0,<br>0,&amp;hostdata.m_nclass,0,&amp;hostdata.m_nclassind );<br>sqlbindparameter(m_hstmt,4,sql_param_input,sql_c_char,sql_varchar,<br>cddata_awenjian_size,0,hostdata.m_awenjian,0,&amp;hostdata.m_awenjianind );<br>sqlbindparameter(m_hstmt,5,sql_param_input,sql_c_slong,sql_integer,0,<br>0,&amp;hostdata.m_nshangji, 0, &amp;hostdata.m_nshangjiind );<br>sqlbindparameter(m_hstmt,6,sql_param_input,sql_c_slong,sql_integer, 0,<br>0, &amp;hostdata.m_nshuxing, 0,&amp;hostdata.m_nshuxingind );<br>sqlbindparameter(m_hstmt, 7,sql_param_input,sql_c_char,sql_varchar,<br>cddata_abeizhu_size,0, hostdata.m_abeizhu, 0,&amp;hostdata.m_abeizhuind );<br><br>}<br><br>// move the data to host structure and execute the statement<br>hostdata.m_nguangpan = pdata-&gt;m_nguangpan;<br>hostdata.m_nwenjian = pdata-&gt;m_nwenjian;<br>hostdata.m_nclass = pdata-&gt;m_nclass;<br>hostdata.m_awenjianind = sql_nts;<br>memcpy(hostdata.m_awenjian, pdata-&gt;m_awenjian, cddata_awenjian_size);<br>hostdata.m_nshangji = pdata-&gt;m_nshangji;<br>hostdata.m_nshuxing = pdata-&gt;m_nshuxing;<br>hostdata.m_abeizhuind = sql_nts;<br>memcpy(hostdata.m_abeizhu, pdata-&gt;m_abeizhu, cddata_abeizhu_size);<br><br>returncode = sqlexecute(m_hstmt);<br>if (returncode != sql_success)<br>{<br>return false;<br>}<br><br>return true;<br><br>}<br><br><br>九、其他操作:<br><br>1、检测sql错误:<br>void displayerror(sqlreturn nresult, sword fhandletype, sqlhandle handle)<br>{<br>uchar szerrstate[sql_sqlstate_size+1]; // sql error state string<br>uchar szerrtext[sql_max_message_length+1]; // sql error text string<br>char szbuffer[1000];<br>char szdispbuffer[1000]; // display buffer<br>// formatted error text buffer<br>sword werrmsglen; // error message length<br>long dwerrcode; // native error code<br>int isize; // display error text size<br>sqlreturn nerrresult; // return code from sqlgetdiagrec<br>sword smsgnum = 1;<br>sword ffirstrun = true;<br><br>szbuffer[0] = '\0';<br><br>do<br>{<br>// continue to bring messageboxes till all errors are displayed.<br>// more than one message box may be reqd. as err text has fixed<br>// string size.<br><br>// initialize display buffer with the string in error text buffer<br>strcpy(szdispbuffer, szbuffer);<br><br>// call sqlgetdiagrec function with proper odbc handles, repeatedly until<br>// function returns sql_no_data. concatenate all error strings<br>// in the display buffer and display all results.<br>while ((nerrresult = sqlgetdiagrec(fhandletype, handle, smsgnum++,<br>szerrstate, &amp;dwerrcode, szerrtext,<br>sql_max_message_length-1, &amp;werrmsglen))<br>!= sql_no_data) {<br><br><br>if(nerrresult == sql_error &brvbar&brvbar nerrresult == sql_invalid_handle)<br>break;<br><br>wsprintf(szbuffer, sqlerr_format, (lpstr)szerrstate, dwerrcode, (lpstr)szerrtext);<br>isize = strlen(szdispbuffer);<br>if (isize &amp;&amp; (isize+strlen(szbuffer)+1) &gt;= 1000)<br>break;<br>if (isize)<br>strcat(szdispbuffer, &quot;\n&quot;);<br>strcat(szdispbuffer, szbuffer);<br>}<br><br>// display proper error or warning message with proper title<br><br>if (nresult == sql_success_with_info)<br>messagebox(null, szdispbuffer, (ffirstrun? sqlwrnmsgtitle : sqlwrncntdtitle),<br>mb_ok &brvbar mb_iconinformation);<br>else<br>messagebox(null, szdispbuffer, (ffirstrun? sqlerrmsgtitle : sqlerrcntdtitle),<br>mb_ok &brvbar mb_iconexclamation);<br><br>if (ffirstrun)<br>ffirstrun = false;<br>}<br>while (!(nerrresult == sql_no_data &brvbar&brvbar nerrresult == sql_error &brvbar&brvbar nerrresult == sql_invalid_handle));<br>}<br>分配和释放语句<br><br>任何与处理和传递sql语句相关的sql函数都要求一个有效的语句句柄作为<br>参数。语句句柄很象环境或连接句柄,区别之处在于它引用sql语句或者其它<br>返回结果的odbc函数。一个连接句柄可以与几个语句句柄相关连,但每一个<br>语句句柄只能与一个连接句柄相关连。应用系统要想分配语句句柄,只需调用<br>下面描述的sqlallocstmt即可。 <br><br>sqlallocstmt为语句句柄分配内存存储区,并将此句柄与连接句柄指定的<br>连接联系在一起。应用系统必须先用sqlallocstmt为sql语句分配内存,然后<br>才能提供引用某一特殊语句句柄的sql语句。<br><br>sqlallocstmt的语法如下:<br>retcode sqlallocstmt(hdbc,phstmt)<br>sqlallocstmt的返回码为:<br>sql-success<br>sql-success-with-info<br>sql-invalid-handle<br>sql-error <br><br><br>sqlfreestmt<br><br>sqlfreestmt完成以下动作:<br>.停止任何与指定语句句柄相关的、当前正在处理的sql语句;<br>关闭任何与指定语句句柄相关的打开光标;<br>舍弃所有未完成的结果。<br>有选择的释放与指定语句句柄相关的所有资源;<br><br>sqlfreestmt的语法为:<br>retcode sqlfreestmt(hstmt,foption) <br>sqlfreestmt的返回码是:<br>sql-success<br>sql-success-with-info<br>sql-invalid-handle<br>sql-error <br><br>最后 <br><br>在我们的开发系统appbuilder中你可以不必对上面的复杂的过程进行完整的了解,你也不必书写任何的调用代码,我们将这一切都自动为你产生,同时还和开发最终程序的界面融合在一起,一切都非常简单。为你的开发自动编写大量的代码,如果你需要看看,请到:www.ucancode.com中下在一个免费的版本。 <br><br><br>
</DIV></div></div>
<script src='../../../get_readnum.asp?id=
290
'></script>
</center></BODY></HTML>

⌨️ 快捷键说明

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