• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

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]
...全文
322 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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类型的,这样做,程序应该不能正常工作吧!




回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2008-05-15 12:32
社区公告
暂无公告