请大家讨论一下,在不稳定的网络环境下,写C/S结构的程序访问数据库要注意些什么问题,以及如何进行错误处理?

解决方案 »

  1.   

    在win2000下可以用com+技术,结合mts和msmq,把网络通信作为事务来处理,大部分工作由系统组件完成。
    否则也可以自己检测一系列相关操作的完整性(非数据库),保存系统原始状态,自己开发doundo功能。至于数据库,流行dbms系统都有事务操作,直接拿来用就是了。
      

  2.   

    // 采 用 事 务处 理 可 以 防 止 数 据 不 一 致 , 数 据 丢 失 
    可 以 参 照 下 面 代 码 
    _ConnectionPtr MyDb;
    _RecordsetPtr pRecordset;
    FieldsPtr pFields;
    FieldPtr  pField;
    //Initialize COM Environment
    ::CoInitialize(NULL); //Creat ADODB.Connection Object
    MyDb.CreateInstance("ADODB.Connection");
    // MyDb.CreateInstance(__uuidof(Connection));
    try{
    HRESULT hr=MyDb->Open ("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=.\\Exec.mdb;","","",NULL);
    }
    catch(...)
    {
    MessageBox("DataBase Connection Error");
    // MyDb->RollbackTrans();
    return false;
    }
    MyDb->BeginTrans();
    _variant_t MyDBPtr;
    MyDBPtr=(IDispatch *) MyDb;
    //Creat ADODB.Recordset Object
    pRecordset.CreateInstance("ADODB.Recordset");

    try{
    HRESULT hr= pRecordset->Open(_variant_t("select * from 社員情報"),
    MyDBPtr,
    adOpenDynamic,adLockOptimistic,adCmdText); }
    catch(...)
    {
    MessageBox("Recordset Connection Error");
    MyDb->RollbackTrans();
    return false;
    }

    intCnt=m_ListView.GetItemCount();

    // intFieldcnt=pFields->Count;
    //pRecordset->MoveFirst();


    try
    {
    while(!pRecordset->ADOEOF)
    {
    pRecordset->Delete(adAffectCurrent);
    pRecordset->MoveNext();

    }
    //pRecordset->Update();
    pRecordset->Close();
    }
    catch(...)
    {
    // AfxMessageBox(e.ErrorMessage());
    AfxMessageBox("delete Error");
    MyDb->RollbackTrans();
    return false;
    }// _RecordsetPtr pRecordset;
    //Creat ADODB.Recordset Object
    pRecordset.CreateInstance("ADODB.Recordset");
    try{
    HRESULT hr= pRecordset->Open(_variant_t("select * from 社員情報"),
    MyDBPtr,
    adOpenDynamic,adLockOptimistic,adCmdText); }
    catch(...)
    {
    MessageBox("Recordset Connection Error");
    MyDb->RollbackTrans();
    return false;
    } if (pRecordset->Supports(adAddNew) &&pRecordset->Supports(adUpdate))
    {
    try{
    for(int i=0;i<intCnt;i++)
    {

    pRecordset->AddNew();
    pFields=pRecordset->Fields;
    pField=pFields->GetItem(_variant_t("社員コード"));
    pField->Value=_variant_t(m_ListView.GetItemText(i,0));
    pFields=pRecordset->Fields;
    pField=pFields->GetItem(_variant_t("氏名"));
    pField->Value=_variant_t(m_ListView.GetItemText(i,1));
    pFields=pRecordset->Fields;
    pField=pFields->GetItem(_variant_t("在籍支社"));
    pField->Value=_variant_t(m_ListView.GetItemText(i,2));
    pFields=pRecordset->Fields;
    pField=pFields->GetItem(_variant_t("部署名"));
    pField->Value=_variant_t(m_ListView.GetItemText(i,3));
    pRecordset->MoveNext();

    }
    // pRecordset->Update();

    }
    catch(...)
    {
    MessageBox("Insert Data Error","ADD Data");
    MyDb->RollbackTrans();
    return false;
    }

    }
    MessageBox("Writing is successful!","Write",MB_OK|MB_ICONINFORMATION); MyDb->CommitTrans();
    pRecordset->Close();
    MyDb->Close();

    return true;