天天看点

读写SQL Server的binary类型(VC/MFC)

 以读写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-&gt;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-&gt;adoEOF)</code>

<code>{</code>

<code>    </code><code>_variant_t vUserID = rs-&gt;GetCollect(</code><code>"UserID"</code><code>);</code>

<code>    </code><code>_variant_t vUserIP = rs-&gt;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>**)&amp;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&lt;4; i++)</code>

<code>        </code><code>//因为是unicode环境,需要转换char为wchar_t</code>

<code>        </code><code>mbtowc</code><code>(&amp;wc, (</code><code>char</code> <code>*)&amp;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