cuptbluesky (苦行僧) ,请进。关于主题: Midas高手请进,Wingsun,猛禽兄,兰企鹅,PPower,pazee,warton,invalid(太多了,写不下)麻

laosan7909 2003-06-18 02:35:07
请问,你的问题解决了没有呢?我也遇到相应的问题。
什么我的服务器定义的函数不能更新呢?
下面是该函数:
STDMETHODIMP TTestMultiImpl::TestSave(VARIANT* CustVar)
{
int ErrCount=0;
m_DataModule->Database1->StartTransaction();
ShowMessage("pass StartTransaction()");//此处会执行
try
{
OleVariant& vCustVar=*(reinterpret_cast<OleVariant*>(CustVar));
if(!vCustVar.IsNull())
{
ErrCount=0;
m_DataModule->DataSetProvider1->ApplyUpdates(vCustVar,0,ErrCount,vCustVar);
if(ErrCount>0)
{
Error("Error in ApplyUpdates",IID_ITestMulti);
ShowMessage("pass Error if");
}
ShowMessage("pass if");//此处不执行
}
m_DataModule->Database1->Commit();
ShowMessage("pass Commit()");//此处也不执行
}
catch(Exception &e)
{
m_DataModule->Database1->Rollback();
ShowMessage("pass Rollback()");//此处执行
return Error(e.Message.c_str(),IID_ITestMulti);
}
return S_OK;
}
我的客户端是:
void __fastcall TForm1::QuerySaveClick(TObject *Sender)
{

OleVariant CustVar;
ClientDataSet1->CheckBrowseMode();
if(ClientDataSet1->ChangeCount>0)
CustVar=ClientDataSet1->Delta;
else
CustVar.ChangeType(VT_NULL);
try
{
IDispatch* disp=(IDispatch *)(DCOMConnection1->AppServer);
ITestMultiDisp srvr((ITestMulti*)disp);
srvr.Bind((IDispatch *)(DCOMConnection1->AppServer)) ;
srvr.TestSave(reinterpret_cast<VARIANTOBJ*>(&CustVar));
ShowMessage("pass");//此处会执行
}
catch(Exception &e)
{
Application->ShowException(&e);
}

}
调用时没有报错,可是就是不会更新
我想问:为什么会在服务器端执行到catch(Exception &e)里面去了呢?而没有报错呢?
请各位大哥指点迷津,小弟谢了先,问题解决了,再开贴感谢
...全文
57 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
RomanticProgrammer 2003-06-24
  • 打赏
  • 举报
回复
1.没有什么不好控制的,对多个TClientDataSet调用ApplyUpdates就可以了。
2.你这样作并没有把任何逻辑从客户端移植到服务器。事实上在你调用你的接口时和调用TClientDataSet的ApplyUpdates所执行的过程是一样的。
3.请看《delphi5.x多层分布式开发》,不是几句话能讲清楚的。
‘不知道你注意没有呢?中间层远程数据模块并不是自动创建的,而且也不能自动创建,在options改动不行。’
远程数据模块可以自动创建的。我一直是这样用的。^_^。是你搞错了。
laosan7909 2003-06-24
  • 打赏
  • 举报
回复
不好意思了,好几天没有上网了。

能不能和RomanticProgrammer() 兰企鹅||南极俺最在讨论一下呢?

以下是我为什么要写接口的原因
1、对于一个多个表同时更新的问题。用上面的方法,我觉得不好控制。

2、对于三层结构来说,我想把对数据的处理放在中间的统一进行处理,这样的话,我维护的时候会
比较方便一点。而且在实际的应用中,就不需要很多的datasetprovider。

3、我对于三层结构的思想是:(帮忙指出这样做的效率如何呢?会不会没有发挥midas的强大的功能呢)
对于添加、修改、删除、查询我用中间的接口来实现。
clientdatase和datasetprovider只用来显示数据用的。


第二个问题是你没有把中间层远程数据模块设为自动创建

不知道你注意没有呢?中间层远程数据模块并不是自动创建的,而且也不能自动创建,在options改动不行。
因为编译的时候会出错。


上面只是我的一些看法,不妥之处,请指正。。。。谢谢!

online 2003-06-23
  • 打赏
  • 举报
回复
学习!
oldcold 2003-06-21
  • 打赏
  • 举报
回复
mark
BCBChina 2003-06-21
  • 打赏
  • 举报
回复
学习!
ChengCheng2000 2003-06-20
  • 打赏
  • 举报
回复
学点东西。。。
RomanticProgrammer 2003-06-19
  • 打赏
  • 举报
回复
第二个问题是你没有把中间层远程数据模块设为自动创建。还有需要把TdateSetProvider 的Option属性加上poAllowCommandText;
RomanticProgrammer 2003-06-19
  • 打赏
  • 举报
回复
在MIDAS中数据的更新有两种方式。使用SQL叙述方式,你需要把TDataSetProvider的ResolveToDataSet设为false。第二钟是由TDataSetProveder连接的数据集组件负责数据的更新。MIDAS标准的数据更新模式是,客户端调用TClientDataset的ApplyUpdatas,然后会触发服务端的TDataSetProvider的ApplyUptates更新。而不是你使用的这样直接调用TDataSetProvider的ApplyUpdates的方法。在你调用TClientDataSet的Applyupdatas时ClientDatset的Delta属性会自动传给TDataSetprovider。你定义一个Viriant来传递它有些多次一句。
调用TClientdataSet的Applyupdates方法做了下面几件事情:
1. Generates a BeforeApplyUpdates event. (This event may not be public on some TCustomClientDataSet descendants.)
2. Calls the provider to apply the updates in the Delta property and receives any records returned by the provider because they generated errors when it attempted to apply them to the database.
3. Generates an AfterApplyUpdates event. (This event may not be public on some TCustomClientDataSet descendants.)
4. Calls the client dataset Reconcile method to reconcile any records that are returned in step 2.
如果用你的方式,1,4是不会发生的。
/////
ShowMessage("pass if");//此处不执行
ShowMessage("pass Commit()");//此处也不执行
这两句没有执行是因为你的代码在_DataModule->DataSetProvider1->ApplyUpdates(vCustVar,0,ErrCount,vCustVar);或者OleVariant& vCustVar=*(reinterpret_cast<OleVariant*>(CustVar));

时已经出错了。所以跳到catch里面去了。
/////
建议你用标准的MIDAS更新方式,而不是自己定义一个专门的接口,即费力有不讨好。
warton 2003-06-19
  • 打赏
  • 举报
回复
不太懂midas
laosan7909 2003-06-18
  • 打赏
  • 举报
回复
我也遇到这样的问题。我的代码
AnsiString asqltxt;
asqltxt = " insert into student(stu_no, stu_name, stu_sex, prvnc_no, insert_date)";
asqltxt += " values('"+(AnsiString)astu_no+"', '"+ (AnsiString)astu_name+"', '"+(AnsiString)astu_sex+"','"+(AnsiString)aprvnc_no+"',";
asqltxt += " '"+(AnsiString)FormatDateTime("YYYYMMDD", Now())+"' )";

try
{
asqltxt = "1";
laosan0618->PtmpQ->Close();//////////在这里就出错了。
asqltxt += "1";
laosan0618->PtmpQ->SQL->Clear();
asqltxt += "1";
laosan0618->PtmpQ->SQL->Add(asqltxt);
asqltxt += "1";

laosan0618->PtmpQ->ExecSQL();
asqltxt += "1";

*a_return = ((WideString)asqltxt).Detach();

}
catch(Exception &E)
{

*a_return = ((WideString)E.Message).Detach();

}


return S_OK;


laosan0618->PtmpQ->Close();//////////在这里就出错了。出错代码是eaccessviolation
还有远程数据模块laosan0618在options是没有被自动创建的(不知到大家注意没有)

也就是说明在laosan0618->PtmpQ没有建立。
我的处理方法是在服务器加入TDataModule 上放一个Query来专门处理execsql语句的。
上面的问题就解决了。不知各位高手有什么想法!
keil c519.05是目前最新版本,和谐文件可用9.01的。 ARM发布Keil μVision4集成开发环境(IDE),用来在微控制器和智能卡设备上创建、仿真和调试嵌入式应用。 μVision4 IDE是为增强开发人员的工作效率设计的,有了它可以更快速、更高效地开发和检验程序。通过μVision4 IDE中引入的灵活的窗口管理系统,开发人员可以使用多台监视器,在可视界面任何地方全面控制窗口放置。 新用户界面可以更好地利用屏幕空间,更有效地组织多个窗口,为开发应用提供整齐高效的环境。 μVision4在μVision3的成功经验的基础上增加了: * System Viewer (系统查看程序)窗口,提供了设备外围寄存器信息,这些信息可以在System Viewer窗口内部直接更改。 * Debug Restore Views (调试恢复视图)允许保存多个窗口布局,为程序分析迅速选择最适合的调试视图。 * Multi-Project Workspace(多项目工作空间)为处理多个并存的项目提供了简化的方法,如引导加载程序和应用程序。 * 为基于ARM Cortex 处理器的MCU提供了Data and instruction trace(数据和指令追踪)功能。 * 扩展了Device Simulation(设备仿真)功能以支持许多新设备,如Luminary、NXP和东芝生产的基于ARM Cortex-M3处理器的MCU;Atmel SAM7/9;及新的8051衍生品,如Infineon XC88x和SiLABS 8051Fxx。 * 支持许多debug adapter interfaces(调试适配器接口),包括ADI miDAS Link、Atmel SAM-ICE、Infineon DAS和ST-Link。 * 如需进一步了解μVision4 IDE,请访问:www.keil.com
Delphi 7.1 Update Release Notes=======================================================This file contains important supplemental and late-breakinginformation that may not appear in the main productdocumentation, and supersedes information contained in otherdocuments, including previously installed release notes.Borland recommends that you read this file in its entirety.NOTE: If you are updating a localized version of Delphi 7, visit the Borland Registered User web site to obtain a localized readme file that may contain important late- breaking information not included in this readme file.IMPORTANT: Delphi must be closed before installing this update. =====================================================CONTENTS * INSTALLING THIS UPDATE * UPDATING LOCALIZED VERSIONS OF DELPHI 7 * KNOWN ISSUES * ISSUES ADDRESSED BY THIS UPDATE - IDE - CORE DATABASE - DATASNAP - DBGO (ADO COMPONENTS) - dbExpress - dbExpress COMPONENTS AND DB VCL - dbExpress CORE DRIVER AND METADATA - dbExpress VENDOR ISSUES - dbExpress CERTIFICATION - WEB SNAP - ACTIVEX - COMPILER - RTL - VCL - THIRD PARTY - BOLD FOR DELPHI * VERIFYING THAT THE UPDATE WAS SUCCESSFUL * FILES INSTALLED BY THIS UPDATE =======================================================INSTALLING THIS UPDATE* This update can not be applied to Delphi 7 Architect Trial version. * This update can not be removed after it is installed.* You will need the original Delphi 7 installation CD available to install this update.* To install this update from the CD, insert the CD, and launch the d7_ent_upd1.exe file appropriate for your locale.* To install this update from the Web, double-click the self-executing installation file and follow the prompts. * The Delphi 7 documentation PDF files are available on the update CD.========================================================UPDATING LOCALIZED VERSIONS OF DELPHI 7* This update can be applied only to the English version of Delphi 7. There are separate updates for the German, French and Japanese ver

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧