BCB新手问题:一是TADOQuery连续调用ExecSQL执行insert时,有时执行不成功?二是编译时设置成Release,中文有时显示为乱码?

fpgzs2 2008-05-15 12:32:00
初学BCB,赶鸭子上架,要接手一个BCB项目的乱摊子,遇到一些问题很是迷惑!还望大家不吝赐教,在此谢谢了先!
问题1:
数据库为Access
bool TDBPoolProcess::OpenQryProc(AnsiString strTmpSQL)
{
try
{
DMCadpm->QryTmp->Close();
DMCadpm->QryTmp->SQL->Clear();
DMCadpm->QryTmp->SQL->Add(strTmpSQL);
DMCadpm->QryTmp->ExecSQL();
DMCadpm->QryTmp->Close();
return true;
}
catch(...)
{
return false;
}
}

bool TDesignWin::SaveSingleWinInfo()
{
try
{
AnsiString strSjRq = DateToStr(Date());

AnsiString strTmpSQL = "insert into DesignTmpWinPara(DesignId,DesignBh,Wkuang,Hkuang,WinDoorAmount,TotalArea,Jftdh,DesignGraphCode,WinDoorCode,FirstBoard,BuildingBh,FixPlace,DesignRemark,ProjectCode,FactoryCode,SeriesCode,DesignWinType,designDate,SeriesName,FactoryJc)";
strTmpSQL += " select DesignId,BK_DesignBh,BK_Wkuang,BK_Hkuang,BK_WinDoorAmount,BK_TotalArea,BK_Jftdh,BK_DesignGraphCode,BK_WinDoorCode,BK_FirstBoard,BK_BuildingBh,BK_FixPlace,BK_DesignRemark,BK_ProjectCode,BK_FactoryCode,BK_SeriesCode,0,'";
strTmpSQL += strSjRq + "',BK_SeriesName,BK_FactoryJc from DesignTmpSingleWinPara where DesignId=" + IntToStr(m_nDesignID);
DBOperate->OpenQryProc(strTmpSQL);

// 在这里弹出一个对话框,等待两三秒再单击“确定”,后面SQL语句就能执行成功(DesignTmpMaterialBill表中有结果),如果这里不“停顿”,则后面的SQL语句就执行不成功(DesignTmpMaterialBill表中没有结果)。
Application->MessageBox("insert DesignTmpWinPara_end!","提示",64);

strTmpSQL = "insert into DesignTmpMaterialBill(MaterialID,MaterialLength,MaterialWidth,MaterialAmount,BoardFlag,LinkRemark,UsePlace,MaterialRemark,UseScope,MaterialType,Compositor,ProjectCode,FactoryCode,SeriesCode,DesignId)";
strTmpSQL += " select MaterialID,MaterialLength,MaterialWidth,sum(MaterialAmount) as MaterialAmount,BoardFlag,LinkRemark,UsePlace,MaterialRemark,UseScope,MaterialType,Compositor,ProjectCode,FactoryCode,SeriesCode,DesignId from DesignLSMaterialBill where DesignId=" + IntToStr(m_nDesignID);
strTmpSQL += " group by MaterialID,MaterialLength,MaterialWidth,BoardFlag,LinkRemark,UsePlace,MaterialRemark,UseScope,MaterialType,Compositor,ProjectCode,FactoryCode,SeriesCode,DesignId";
DBOperate->OpenQryProc(strTmpSQL);

return true;
}
catch(...)
{
m_strErrorMsg = "保存窗型设计信息时出错!";
return false;
}
}


问题2:
编译时设置成Release后(不知对不对,设置如下:Compile->单击Release,Linker去掉“Use Dyamic RTL”和“Use debug libraries”前面的√,Prackages去掉“Build with runtime packages”前面的√),为什么类似以下的代码,弹出的对话框中字符串显示为乱码。
    TDesignWin NewDesignWin;
if (!NewDesignWin.SingleWinCompute(strErrorMsg))
{
Screen->Cursor=crDefault;
Application->MessageBox(("材料计算失败!" + strErrorMsg).c_str(),"提示",64);
return;
}

[IMG]http://i278.photobucket.com/albums/kk109/fpgzs/lm.jpg[/IMG]
...全文
421 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
h13bk 2008-05-19
  • 打赏
  • 举报
回复
DBOperate->OpenQryProc(strTmpSQL);
Application->ProcessMessages();
::Sleep(0);
fpgzs2 2008-05-17
  • 打赏
  • 举报
回复
数据量应该不大呀
第一条SQL语句所涉及的记录数一般只有几条左右
第二条SQL语句所涉及的记录数一般也只有几十条左右

关于第二个问题,如果是设置为Debug版,则不成在这个问题。我两台电脑上都是这样,其中一台还是刚重装系统不久,有不有可能是由于第三方组件引起的呀?
yagzh2000 2008-05-17
  • 打赏
  • 举报
回复
你的第一个问题:如果同时执行语句,后台工作量大,产生数据丢失,建议你用事物来控制一下就好了
二个问题: 可能你的系统有问题了,我原来遇见过,没办法又重装了操作系统。
fpgzs2 2008-05-17
  • 打赏
  • 举报
回复
问题还是没解决
顶上去!
castlooo 2008-05-16
  • 打赏
  • 举报
回复
已经很全了
jxw1987628 2008-05-16
  • 打赏
  • 举报
回复


再说一次,insert,update,delete语句要用ExeSQL方法

其他返回数据集的语句要用Open或者Active=true;的方法
fpgzs2 2008-05-16
  • 打赏
  • 举报
回复
如果不调试,直接运行,则不会弹出上面的异常对话框。

但修改为“DMCadpm->QryTmp->Open(); ”后,跟原先的情况是一样的,也是要在两段SQL之间有一个延时,才会执行成功,不然表中一样没有结果。

到底是什么原因呢?
fpgzs2 2008-05-16
  • 打赏
  • 举报
回复
是把
DMCadpm->QryTmp->ExecSQL();
改为
DMCadpm->QryTmp->Open();

修改后,单步执行到"DMCadpm->QryTmp->Open();"时,会报告异常,截图如下:


fpgzs2 2008-05-16
  • 打赏
  • 举报
回复
我换成Open一样一行!!!
参见6楼和7楼回复。

[Quote=引用 9 楼 jxw1987628 的回复:]


再说一次,insert,update,delete语句要用ExeSQL方法

其他返回数据集的语句要用Open或者Active=true;的方法
[/Quote]
fpgzs2 2008-05-15
  • 打赏
  • 举报
回复
ssyqcwj 2008-05-15
  • 打赏
  • 举报
回复
对于返回数据集的SQL语句使用Open
对于不返回数据集的SQL语句使用ExecSQL
fpgzs2 2008-05-15
  • 打赏
  • 举报
回复
???

[Quote=引用 4 楼 ydlchina 的回复:]
对于不返回数据的sql使用Open
[/Quote]
ydlchina 2008-05-15
  • 打赏
  • 举报
回复
对于不返回数据的sql使用Open
fpgzs2 2008-05-15
  • 打赏
  • 举报
回复
这个SQL是应该没有问题,第一条是可以执行成功的(即DesignTmpWinPara中插入了正确的数据)
实现的功能是:把DesignTmpSingleWinPara表中满足条件的记录insert到DesignTmpWinPara表中。

另外,OpenQryProc只能执行update,Insert,Delete类的不返回数据集的sql语句
居我所知,应该是指不能执行以select开头的SQL语句吧,因为ExecSQL不会返回记录集,所以哪样是没有意义的!
jxw1987628 2008-05-15
  • 打赏
  • 举报
回复
楼主的代码有问题


bool TDBPoolProcess::OpenQryProc(AnsiString strTmpSQL)你这个函数,只能执行update,Insert,Delete类的不返回数据集的sql语句

AnsiString strTmpSQL = "insert into DesignTmpWinPara(DesignId,DesignBh,Wkuang,Hkuang,WinDoorAmount,TotalArea,Jftdh,DesignGraphCode,WinDoorCode,FirstBoard,BuildingBh,FixPlace,DesignRemark,ProjectCode,FactoryCode,SeriesCode,DesignWinType,designDate,SeriesName,FactoryJc)";

strTmpSQL += "select DesignId,BK_DesignBh,BK_Wkuang,BK_Hkuang,BK_WinDoorAmount, BK_TotalArea,BK_Jftdh,BK_DesignGraphCode,BK_WinDoorCode,BK_FirstBoard,BK_BuildingBh, BK_FixPlace,BK_DesignRemark,BK_ProjectCode,BK_FactoryCode,BK_SeriesCode,0,'";


再看看你这个sql,里面即包含insert类,也包含select类型的,这样做,程序应该不能正常工作吧!




13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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