环境:Wince6.0 SqlserverCE3.5 VS2008 MFC
问题:请问如何在wince下如何ado方式使用sqlce数据库?我现在能够连接上了,但不能查询结果,真是郁闷啊。IID iid_connection = {0x113033DE, 0xF682, 0x11d2, {0xBB, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}};
IID iid_recordset = {0x113033F6, 0xF682, 0x11d2, {0xBB, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}};
TCHAR g_szAdocConnId[] = TEXT("ADOCE.Connection.3.1");
TCHAR g_szAdocRsdId[] = TEXT("ADOCE.Recordset.3.1"); IADOCEConnection* m_adoCon = NULL;
IADOCERecordset*  m_adoRs = NULL;
IADOCEFields*   m_adoFields = NULL;
IADOCEField*   m_adoField = NULL; CString cs;
CString constr = _T("Database=\\NandFlash\\111.sdf;Password=111;"); //连接字符串
CString strsql = _T("select * from ttt"); CLSID tclsid;
HRESULT hr = CLSIDFromProgID(g_szAdocConnId, &tclsid);
if (FAILED(hr))
{
ShowMsg("CLSIDFromProgID Failed");
return;
}
//创建ado连接对象
hr = CoCreateInstance(tclsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, iid_connection, (LPVOID*)&m_adoCon);
if (FAILED(hr) || !m_adoCon)
{
ShowMsg("CoCreateInstance Failed");
return;
} hr = m_adoCon->put_Provider(TEXT(/*"cedb"*/"Microsoft.SQLSERVER.OLEDB.CE.3.5"));
if (FAILED(hr))
{
ShowMsg("put_Provider Failed");
goto Exit;
} hr = CLSIDFromProgID(g_szAdocRsdId, &tclsid);
if (FAILED(hr))
{
ShowMsg("CLSIDFromProgID g_szAdocRsdId Failed");
goto Exit;
} //创建结果集对象
hr = CoCreateInstance(tclsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, iid_recordset, (LPVOID*)&m_adoRs);
if (FAILED(hr) || !m_adoRs)
{
ShowMsg("CoCreateInstance m_adoRs Failed");
goto Exit;
} //建立连接
hr = m_adoCon->Open(_T("Database=\\NandFlash\\111.sdf;Password=111;"), _T(""), _T(""), adOpenUnspecified);
if (FAILED(hr))
{
ShowMsg("Open Failed");
goto Exit;
} //绑定连接到记录集
VARIANT vcon1;
VariantInit(&vcon1);
vcon1.pdispVal = m_adoCon;
vcon1.vt = VT_DISPATCH;
hr = m_adoRs->put_ActiveConnection(vcon1);
if (FAILED(hr))
{
ShowMsg("put_ActiveConnection Failed");
goto Exit;
} ShowMsg("Create Connection OK!");  //程序能够执行到这里 //查询结果
VARIANT vstrsql, vempty;
VariantInit(&vstrsql);
VariantInit(&vempty);
vstrsql.bstrVal = SysAllocString(strsql);
vstrsql.vt = VT_BSTR;
hr = m_adoRs->Open(vstrsql, vempty, adOpenDynamic, adLockOptimistic, /*adCmdText*/adCmdTableDirect);
SysFreeString(vstrsql.bstrVal); if (FAILED(hr))
{
ShowMsg("exec Failed");
goto Exit;
}
ShowMsg("exec OK"); LONG ircount = 0;
m_adoRs->get_RecordCount(&ircount);
cs.Format(L"get %d rows", ircount);
ShowMsg(cs); VARIANT vdata,vsel;
VARIANT_BOOL iEOF = FALSE;
m_adoRs->MoveFirst();
hr = m_adoRs->get_EOF(&iEOF); while(!iEOF)
{
//得到表中字段集对象
hr = m_adoRs->get_Fields(&m_adoFields);
vsel.uiVal = 0;
vsel.vt = VT_UI2;
hr = m_adoFields->get_Item(vsel, &m_adoField);
hr = m_adoField->get_Value(&vdata); //得到字段对象
vsel.uiVal = 1;
vsel.vt = VT_UI4;
hr = m_adoFields->get_Item(vsel, &m_adoField);
hr = m_adoField->get_Value(&vdata);
m_adoRs->MoveNext();
m_adoRs->get_EOF(&iEOF);
}
m_adoRs->Close();Exit:
DEL_HR(m_adoRs);
DEL_HR(m_adoCon);
DEL_HR(m_adoField);
DEL_HR(m_adoFields);
有以下几个问题:
1.put_Provider时,使用cedb就能连上,但使用Microsoft.SQLSERVER.OLEDB.CE.3.5之类的就不行;网上查了下,说是cedb是连接Access的,不知道对不对,应该怎么填?
2.现在能够执行到ShowMsg("Create Connection OK!");这里,也就是能够连上了,但后面的执行sql语句时老是失败,请问这是为什么??

解决方案 »

  1.   

    m_adoRs->Open的第二个参数是连接m_adoCon。
      

  2.   


    换成了vcon1还是不行。
    前面hr = m_adoRs->put_ActiveConnection(vcon1)已经将记录绑定到连接了,Open这里应该不用绑定了吧。
      

  3.   

    把m_adoRs->Open的第二个参数换成vcon1,hr = m_adoRs->put_ActiveConnection(vcon1)注释掉。
      

  4.   


    还是不行啊,只能执行到ShowMsg("Create Connection OK!");这里,后面的m_adoRs->Open总是失败!!
    我昨天试了下oledb方式,能够实现查询功能,为什么ado方式不行呢???
    但我下了个能够在wince下运行的ado查询程序,发现它能够实现,就是不知道是怎么实现的,可惜没有源码
      

  5.   

    那就不清楚了,没有做过wince的程序,不能用#import的方式导入ADO库吗,可以的话参考下置顶帖的改下就参不多了。
      

  6.   


    请问是哪个帖子,能不能给个地址?
    是这么写么:
    在stdafx.h添加:#import "adoce31.dll" no_namespace rename("EOF", "adoEOF") 
    在OnInitialUpdate()添加:AfxOleInit();
    把库考到相同文件夹下,结果连不上。。
      

  7.   

    http://bbs.csdn.net/topics/340001609
      

  8.   

    请问楼主问题解决了吗?我遇到了跟你完全一样的问题,OLEDB 能查,ADO 能连接,但不能open 。 还望楼主不吝赐教! QQ:87299840,邮箱就是QQ 邮箱。谢谢!
      

  9.   

    这个问题我新开了个贴:http://bbs.csdn.net/topics/390557705
    楼主回复我就散分