以读写32位的IP地址为例。表的设计视图如下:
示例代码如下,其中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