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

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

wKioL1NPc1WB421aAAAOJrGl0DU369.png

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

//初始化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 ***


你可能感兴趣的:(sql,server,binary,MFC/VC/C++)