以讀寫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