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

📄 ado数据库编程入门.htm

📁 VC程序员的 ADO数据库编程入门.htm
💻 HTM
📖 第 1 页 / 共 5 页
字号:
          {<br>
          &nbsp;&nbsp;&nbsp; printf(&quot;Name: %s\t %s\tPhone: %s\n&quot;,&nbsp;(rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : &quot;&quot;),
          (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : &quot;&quot;),
          (rs.lphoneStatus == adFldOK ?rs.m_szphone : &quot;&quot;));<br>
          <br>
          &nbsp;&nbsp;&nbsp;
          if (rs.lphoneStatus == adFldOK)<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          strcpy(rs.m_szphone, &quot;777&quot;);<br>
          <br>
&nbsp;&nbsp;&nbsp;
          TESTHR(picRs-&gt;Update(&amp;rs)); // Add change to the batch<br>
          &nbsp;&nbsp;&nbsp; Rs1-&gt;MoveNext();<br>
          }<br>
          Rs1-&gt;Filter = (long) adFilterNone;<br>
          ......<br>
          if (picRs) picRs-&gt;Release();<br>
          Rs1-&gt;Close();<br>
          pConn-&gt;Close();</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          只要字段的状态是adFldOK,就可以访问。如果修改了字段,不要忘了先调用picRs的Update(注意不是Recordset的Update),然后才关闭,也不要忘了释放picRs(即picRs-&gt;Release();)。<br>
          <br>
          (4). 此时还可以用IADORecordBinding接口添加新纪录<br>
          <br>
          </font>
</font>

          <font color="#99CCFF" face="宋体" size="2">if(FAILED(picRs-&gt;AddNew(&amp;rs)))<br>
          &nbsp;&nbsp;&nbsp; ......</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          11. 访问长数据<br>
          在Microsoft SQL中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。<br>
          可以用Field对象的GetChunk和AppendChunk方法来访问。每次可以读出或写入全部数据的一部分,它会记住上次访问的位置。但是如果中间访问了别的字段后,就又得从头来了。<br>
          请看下面的例子:<br>
          //写入一张照片到数据库:<br>
          <br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          VARIANT varChunk;<br>
          SAFEARRAY *psa;<br>
          SAFEARRAYBOUND rgsabound[1];<br>
          //VT_ARRAY | VT_UI1<br>
          <br>
          CFile f(&quot;h:\\aaa.jpg&quot;,CFile::modeRead);<br>
          BYTE bVal[ChunkSize+1];<br>
          UINT uIsRead=0;<br>
          <br>
          //Create a safe array to store the array of BYTES&nbsp;<br>
          while(1)<br>
          {<br>
          &nbsp;&nbsp;&nbsp; uIsRead=f.Read(bVal,ChunkSize);<br>
          &nbsp;&nbsp;&nbsp; if(uIsRead==0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
          &nbsp;&nbsp;&nbsp; rgsabound[0].cElements =uIsRead;<br>
          &nbsp;&nbsp;&nbsp;
          rgsabound[0].lLbound = 0;<br>
          &nbsp;&nbsp;&nbsp; psa = SafeArrayCreate(VT_UI1,1,rgsabound);<br>
          <br>
          &nbsp;&nbsp;&nbsp; for(long index=0;index&lt;uIsRead;index++)<br>
          &nbsp;&nbsp;&nbsp; {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FAILED(SafeArrayPutElement(psa,&amp;index,&amp;bVal[index])))<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::MessageBox(NULL,&quot;啊,又出毛病了。&quot;,&quot;提示&quot;,MB_OK | MB_ICONWARNING);<br>
          &nbsp;&nbsp;&nbsp; }<br>
          <br>
          &nbsp;&nbsp;&nbsp; varChunk.vt = VT_ARRAY|VT_UI1;<br>
          &nbsp;&nbsp;&nbsp; varChunk.parray = psa;<br>
          &nbsp;&nbsp;&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pRecordset-&gt;Fields-&gt;GetItem(&quot;photo&quot;)-&gt;AppendChunk(varChunk);<br>
          &nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp; catch (_com_error &amp;e)<br>
          &nbsp;&nbsp;&nbsp; {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str=(char*)e.Description();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::MessageBox(NULL,str+&quot;\n又出毛病了。&quot;,&quot;提示&quot;,MB_OK | MB_ICONWARNING);<br>
          &nbsp;&nbsp;&nbsp; }<br>
          <br>
          &nbsp;&nbsp;&nbsp; ::VariantClear(&amp;varChunk);<br>
          &nbsp;&nbsp;&nbsp; ::SafeArrayDestroyData( psa);<br>
          &nbsp;&nbsp;&nbsp; if(uIsRead&lt;ChunkSize)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
          }//while(1)&nbsp;<br>
          <br>
          f.Close();<br>
          <br>
          //从数据库读一张照片:<br>
          CFile f;<br>
          f.Open(&quot;h:\\bbb.jpg&quot;,CFile::modeWrite|CFile::modeCreate);<br>
          long lPhotoSize = m_pRecordset-&gt;Fields-&gt;Item[&quot;photo&quot;]-&gt;ActualSize;&nbsp;<br>
          long lIsRead=0;<br>
          _variant_t varChunk;<br>
          BYTE buf[ChunkSize];<br>
          <br>
          while(lPhotoSize&gt;0)<br>
          {<br>
          &nbsp;&nbsp;&nbsp; lIsRead=lPhotoSize&gt;=ChunkSize? ChunkSize:lPhotoSize;<br>
          &nbsp;&nbsp;&nbsp; varChunk = m_pRecordset-&gt;Fields-&gt;Item[&quot;photo&quot;]-&gt;GetChunk(lIsRead);<br>
          <br>
          &nbsp;&nbsp;&nbsp; for(long index=0;index&lt;lIsRead;index++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
          &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::SafeArrayGetElement(varChunk.parray,&amp;index,buf+index);&nbsp;&nbsp;&nbsp;<br>
          &nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp; f.Write(buf,lIsRead);<br>
          &nbsp;&nbsp;&nbsp; lPhotoSize-=lIsRead;<br>
          }//while()<br>
          <br>
          f.Close();</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          12. 使用SafeArray问题<br>
          学会使用SafeArray也是很重要的,因为在ADO编程中经常要用。它的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。&nbsp;<br>
          使用SafeArray的具体步骤:<br>
          <br>
          方法一:<br>
          &nbsp;包装一个SafeArray:<br>
          <br>
          (1). 定义变量,如:<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          VARIANT varChunk;<br>
          SAFEARRAY *psa;<br>
          SAFEARRAYBOUND rgsabound[1];<br>
</font>

<font face="Arial">

          <font face="Arial" size="2">
          <br>
          (2). 创建SafeArray描述符:<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          uIsRead=f.Read(bVal,ChunkSize);//read array from a file.<br>
          if(uIsRead==0)<br>
&nbsp;&nbsp;&nbsp; break;<br>
          rgsabound[0].cElements =uIsRead;<br>
          rgsabound[0].lLbound = 0;<br>
          psa = SafeArrayCreate(VT_UI1,1,rgsabound);</font><font face="Arial"><font face="Arial" size="2"><font color="#99CCFF"><br>
          </font>
          <br>
          (3). 放置数据元素到SafeArray:<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          for(long index=0;index&lt;uIsRead;index++)&nbsp;<br>
          {<br>
          &nbsp;&nbsp;&nbsp; if(FAILED(SafeArrayPutElement(psa,&amp;index,&amp;bVal[index])))<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::MessageBox(NULL,&quot;出毛病了。&quot;,&quot;提示&quot;,MB_OK | MB_ICONWARNING);<br>
          }</font><font face="Arial"><font face="Arial" size="2"><br>
          &nbsp;一个一个地放,挺麻烦的。<br>
          <br>
          (4). 封装到VARIANT内:<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          varChunk.vt = VT_ARRAY|VT_UI1;<br>
          varChunk.parray = psa;</font><font face="Arial"><font face="Arial" size="2"><br>
          &nbsp;这样就可以将varChunk作为参数传送出去了。<br>
          &nbsp;读取SafeArray中的数据的步骤:<br>
          <br>
          (1). 用SafeArrayGetElement一个一个地读<br>
          <br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          BYTE buf[lIsRead];<br>
          for(long index=0;index&lt;lIsRead;index++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
          {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
          &nbsp;&nbsp;&nbsp; ::SafeArrayGetElement(varChunk.parray,&amp;index,buf+index);&nbsp;&nbsp;&nbsp;<br>
          }</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          &nbsp;就读到缓冲区buf里了。<br>
          <br>
          方法二:<br>
          &nbsp;使用SafeArrayAccessData直接读写SafeArray的缓冲区:<br>
          <br>
          (1). 读缓冲区:<br>
          </font>
</font>

          <font color="#99CCFF" face="宋体" size="2">BYTE *buf;<br>
          SafeArrayAccessData(varChunk.parray, (void **)&amp;buf);<br>
          f.Write(buf,lIsRead);<br>
          SafeArrayUnaccessData(varChunk.parray);</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          (2). 写缓冲区:<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          BYTE *buf;<br>
          ::SafeArrayAccessData(psa, (void **)&amp;buf);<br>
          for(long index=0;index&lt;uIsRead;index++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
          {<br>
          &nbsp;&nbsp;&nbsp; buf[index]=bVal[index];&nbsp;&nbsp;<br>
          }<br>
          ::SafeArrayUnaccessData(psa);<br>
          varChunk.vt = VT_ARRAY|VT_UI1;<br>
          varChunk.parray = psa;<br>
</font>

<font face="Arial">

          <font face="Arial" size="2">这种方法读写SafeArray都可以,它直接操纵SafeArray的数据缓冲区,比用SafeArrayGetElement和SafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用::SafeArrayUnaccessData(psa),否则会出错的。<br>
          <br>
          13. 使用书签( bookmark )<br>
          书签可以唯一标识记录集中的一个记录,用于快速地将当前记录移回到已访问过的记录,以及进行过滤等等。Provider会自动为记录集中的每一条记录产生一个书签,我们只需要使用它就行了。我们不能试图显示、修改或比较书签。ADO用记录集的Bookmark属性表示当前记录的书签。<br>
          用法步骤:<br>
          <br>
          (1). 建立一个VARIANT类型的变量<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          _variant_t VarBookmark;</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          (2). 将当前记录的书签值存入该变量<br>
          也就是记录集的Bookmark属性的当前值。<br>
          </font>
</font>

<font face="宋体" size="2" color="#99CCFF">

          VarBookmark = rst-&gt;Bookmark;</font><font face="Arial"><font face="Arial" size="2"><br>
          <br>
          (3). 返回到先前的记录<br>
          将保存的书签值设置到记录集的书签属性中:<br>
          <br>
          </font>
</font>

⌨️ 快捷键说明

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