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

 以读写32位的IP地址为例。表的设计视图如下:

wKioL1NPc1WB421aAAAOJrGl0DU369.png

  示例代码如下,其中CMSSADO为walker简单封装的类,不必关心,重点在代码中标注关键代码部分。为了减少代码,突出重点,代码中没有加入异常处理。walker的编译环境为win7 x64下vs2010,数据库为sql server 2008 R2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//初始化ADO环境
AfxOleInit();
CMSSADO mss_ado;
CString str;
CString conn_str = _T( "Provider=SQLOLEDB;" );
conn_str += _T( "SERVER=127.0.0.1;" );
conn_str += _T( "DATABASE=walker_test;" );
conn_str += _T( "UID=sa;" );
conn_str += _T( "PWD=xxxxxxx;" );
mss_ado.OpenConnection(conn_str);
ADODB::_ConnectionPtr conn = mss_ado.GetConnectionPtr();
CString sql = _T( "INSERT INTO IPTbl(UserIP) VALUES(0x11223344)" );    //插入
conn->Execute((_bstr_t)sql, NULL, ADODB::adCmdText);
sql = _T( "SELECT TOP 1 [UserID], [UserIP] FROM IPTbl" );  //读取
ADODB::_RecordsetPtr rs = NULL;
mss_ado.OpenRecordset(sql);
rs = mss_ado.GetRecordsetPtr();
CString UserID = _T( "" ),
         UserIP = _T( "" );
if  (!rs->adoEOF)
{
     _variant_t vUserID = rs->GetCollect( "UserID" );
     _variant_t vUserIP = rs->GetCollect( "UserIP" );
     UserID = ( TCHAR *)(_bstr_t)(vUserID);
     / begin 关键代码 /
     char  *pBuf = NULL;
     char  bytmp[4];
     memset (bytmp, 0,  sizeof (bytmp));
     SafeArrayAccessData(vUserIP.parray, ( void  **)&pBuf);
     if  (pBuf != NULL)
     {
         memcpy (bytmp, pBuf,  sizeof (bytmp));
     }
     SafeArrayUnaccessData (vUserIP.parray);
                         
     wchar_t  wc;
     CString s;
     for ( int  i=0; i<4; i++)
     {
         //因为是unicode环境,需要转换char为wchar_t
         mbtowc (&wc, ( char  *)&bytmp[i], MB_LEN_MAX);
         s.Format(_T( "%X" ), wc);
         UserIP += s;
     }
     / end 关键代码 /
     AfxMessageBox(_T( "UserIP: " ) + UserIP);
}
sql = _T( "UPDATE IPTbl SET UserIP=0x" ) + UserIP + _T( " WHERE UserID=" ) + UserID;     //修改
conn->Execute((_bstr_t)sql, NULL, ADODB::adCmdText);
//关闭ado环境
AfxOleTerm();
AfxMessageBox(_T( "OK" ));


*** walker ***

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1397171如需转载请自行联系原作者

RQSLT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值