void CMapWnd::OnSavetosql() 
{
// TODO: Add your command handler code here
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("delete from Lib");
m_AdoConn.ExecuteSQL((_bstr_t)sql);
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
{
if(m_edit.m_cMap[i][j]!=0)
{
sql.Format("insert into Lib(row,col,thing)values(%d,%d,%d)",i,j,m_edit.m_cMap[i][j]);
m_AdoConn.ExecuteSQL((_bstr_t)sql);
}
}
m_AdoConn.ExitConn();
}void CMapWnd::OnRead() 
{
// TODO: Add your command handler code here
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select * from Lib");
m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql);
int i,j,thing;
while(m_pRs->adoEOF)
{
i=atoi((char*)(_bstr_t)m_pRs->GetCollect("cow"));
j=atoi((char*)(_bstr_t)m_pRs->GetCollect("col"));
thing=atoi((char*)(_bstr_t)m_pRs->GetCollect("thing"));
m_edit.m_cMap[i][j]=thing;
m_pRs->MoveNext();
}
m_AdoConn.ExitConn();
Invalidate(TRUE);
}
m_pRs里始终为空。但是第一个函数已经写入了数据了。用企业管理器查也可以查到。

解决方案 »

  1.   

    void ADOConn::OnInitADOConn()//连接数据库
    {

    try
    {
    ::CoInitialize(NULL); //初始化OLE/COM库环境
    m_pCon.CreateInstance("ADODB.Connection");
    m_pCon->ConnectionTimeout=3;//连接尝试时间
    //连接SQL Server数据库
    m_pCon->Open("Provider=SQLOLEDB;Server=127.0.0.1;Database=mota;UID=sa;PWD=123;", "", "",adModeUnknown);
    }
    catch(_com_error e)//捕捉异常
    {
    AfxMessageBox(e.Description());
    }
    }void ADOConn::ExitConn()//断开连接
    {
    if(m_pRs!=NULL)
    m_pRs->Close();
    m_pCon->Close();

    }_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)//执行SQL查询语句
    {
    try
    {
    if(m_pCon==NULL)
    OnInitADOConn();
    m_pRs.CreateInstance("ADODB.Recordset");//创建记录集
    m_pRs->Open(bstrSQL,m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    }
    catch(_com_error e)//捕捉异常
    {
    AfxMessageBox(e.Description());
    }
    return m_pRs;//返回结果集
    }BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)//执行SQL操作语句
    {
    try
    {
    if(m_pCon==NULL)
    OnInitADOConn();//连接数据库
    m_pCon->Execute(bstrSQL,NULL,adCmdText);//执行SQL
    return true;
    }
    catch(_com_error e)//捕捉异常
    {
    AfxMessageBox(e.Description());
    return false;
    }
    }
      

  2.   

    你写完数据后,把程序关掉,然后再重新运行,再读数据,你看能读到吗?
    你这个程序在不停的连接数据库,这样设计不好,最好是一个程序中只保存一个Connection,而且是只在程序初始化时仅仅连接一次数据库即可。
      

  3.   

    Excute执行返回的记录集是只读的,需要用_RecordsetPtr::Open打开才可以。
      

  4.   

    void CMapWnd::OnRead()  
    {
    // TODO: Add your command handler code here
    m_AdoConn.OnInitADOConn();
    CString sql;
    sql.Format("select * from Lib");
    m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql);//打开记录集(_ConnectionPtr m_pConnection)
    m_pRs->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,
    adLockOptimistic,adCmdText);

    int i,j,thing;
    while(m_pRs->adoEOF)
    {
    i=atoi((char*)(_bstr_t)m_pRs->GetCollect("cow"));
    j=atoi((char*)(_bstr_t)m_pRs->GetCollect("col"));
    thing=atoi((char*)(_bstr_t)m_pRs->GetCollect("thing"));
    m_edit.m_cMap[i][j]=thing;
    m_pRs->MoveNext();
    }
    m_AdoConn.ExitConn();
    Invalidate(TRUE);
    }
      

  5.   

    while(!m_pRs->adoEOF)