请大家讨论一下,在不稳定的网络环境下,写C/S结构的程序访问数据库要注意些什么问题,以及如何进行错误处理? 请大家讨论一下,在不稳定的网络环境下,写C/S结构的程序访问数据库要注意些什么问题,以及如何进行错误处理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在win2000下可以用com+技术,结合mts和msmq,把网络通信作为事务来处理,大部分工作由系统组件完成。否则也可以自己检测一系列相关操作的完整性(非数据库),保存系统原始状态,自己开发doundo功能。至于数据库,流行dbms系统都有事务操作,直接拿来用就是了。 // 采 用 事 务处 理 可 以 防 止 数 据 不 一 致 , 数 据 丢 失 可 以 参 照 下 面 代 码 _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; VS2010 MFC工程能否调用C#中的控件? 怎么得到图像的内容? 如何设置浏览器的字体 JPG转换为BMP 怎么写一个动态链接库 如何从文件的全路径中取出文件名? 如从C:\path\aa\cc.txt中取出cc.txt来? 51期间还坚持在工作岗位的同志们来接分吧,我就是痛并快乐着的一个啊 求教VC做个JAVAScript的编译器 用vc+ado+sql2000,读Northwind表可以,自己建了新表,加了5条记录,select返回为-1?是不是权限问题? 如何改变Edit中的制表符的宽度? 哪位能提供一个图书管理的源码给我参考? 请问谁有用socket进行二进制文件传输的vc源程序
否则也可以自己检测一系列相关操作的完整性(非数据库),保存系统原始状态,自己开发doundo功能。至于数据库,流行dbms系统都有事务操作,直接拿来用就是了。
可 以 参 照 下 面 代 码
_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;