以读写32位的IP地址为例。表的设计视图如下:
<a href="http://s3.51cto.com/wyfs02/M01/24/72/wKioL1NPc1WB421aAAAOJrGl0DU369.png" target="_blank"></a>
示例代码如下,其中CMSSADO为walker简单封装的类,不必关心,重点在代码中标注关键代码部分。为了减少代码,突出重点,代码中没有加入异常处理。walker的编译环境为win7 x64下vs2010,数据库为sql server 2008 R2。
<code>//初始化ADO环境</code>
<code>AfxOleInit();</code>
<code>CMSSADO mss_ado;</code>
<code>CString str;</code>
<code>CString conn_str = _T(</code><code>"Provider=SQLOLEDB;"</code><code>);</code>
<code>conn_str += _T(</code><code>"SERVER=127.0.0.1;"</code><code>);</code>
<code>conn_str += _T(</code><code>"DATABASE=walker_test;"</code><code>);</code>
<code>conn_str += _T(</code><code>"UID=sa;"</code><code>);</code>
<code>conn_str += _T(</code><code>"PWD=xxxxxxx;"</code><code>);</code>
<code>mss_ado.OpenConnection(conn_str);</code>
<code>ADODB::_ConnectionPtr conn = mss_ado.GetConnectionPtr();</code>
<code>CString sql = _T(</code><code>"INSERT INTO IPTbl(UserIP) VALUES(0x11223344)"</code><code>); </code><code>//插入</code>
<code>conn->Execute((_bstr_t)sql, NULL, ADODB::adCmdText);</code>
<code>sql = _T(</code><code>"SELECT TOP 1 [UserID], [UserIP] FROM IPTbl"</code><code>); </code><code>//读取</code>
<code>ADODB::_RecordsetPtr rs = NULL;</code>
<code>mss_ado.OpenRecordset(sql);</code>
<code>rs = mss_ado.GetRecordsetPtr();</code>
<code>CString UserID = _T(</code><code>""</code><code>),</code>
<code> </code><code>UserIP = _T(</code><code>""</code><code>);</code>
<code>if</code> <code>(!rs->adoEOF)</code>
<code>{</code>
<code> </code><code>_variant_t vUserID = rs->GetCollect(</code><code>"UserID"</code><code>);</code>
<code> </code><code>_variant_t vUserIP = rs->GetCollect(</code><code>"UserIP"</code><code>);</code>
<code> </code><code>UserID = (</code><code>TCHAR</code><code>*)(_bstr_t)(vUserID);</code>
<code> </code><code>///// begin 关键代码 /////</code>
<code> </code><code>char</code> <code>*pBuf = NULL;</code>
<code> </code><code>char</code> <code>bytmp[4];</code>
<code> </code><code>memset</code><code>(bytmp, 0, </code><code>sizeof</code><code>(bytmp));</code>
<code> </code><code>SafeArrayAccessData(vUserIP.parray, (</code><code>void</code> <code>**)&pBuf);</code>
<code> </code><code>if</code> <code>(pBuf != NULL)</code>
<code> </code><code>{</code>
<code> </code><code>memcpy</code><code>(bytmp, pBuf, </code><code>sizeof</code><code>(bytmp));</code>
<code> </code><code>}</code>
<code> </code><code>SafeArrayUnaccessData (vUserIP.parray);</code>
<code> </code>
<code> </code><code>wchar_t</code> <code>wc;</code>
<code> </code><code>CString s;</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=0; i<4; i++)</code>
<code> </code><code>//因为是unicode环境,需要转换char为wchar_t</code>
<code> </code><code>mbtowc</code><code>(&wc, (</code><code>char</code> <code>*)&bytmp[i], MB_LEN_MAX);</code>
<code> </code><code>s.Format(_T(</code><code>"%X"</code><code>), wc);</code>
<code> </code><code>UserIP += s;</code>
<code> </code><code>///// end 关键代码 /////</code>
<code> </code><code>AfxMessageBox(_T(</code><code>"UserIP: "</code><code>) + UserIP);</code>
<code>}</code>
<code>sql = _T(</code><code>"UPDATE IPTbl SET UserIP=0x"</code><code>) + UserIP + _T(</code><code>" WHERE UserID="</code><code>) + UserID; </code><code>//修改</code>
<code>//关闭ado环境</code>
<code>AfxOleTerm();</code>
<code>AfxMessageBox(_T(</code><code>"OK"</code><code>));</code>
*** walker ***
本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1397171如需转载请自行联系原作者
RQSLT