紧急求助:操作SQL数据库出了问题,提示如下:

wolf416 2001-07-20 09:11:39
Project Lct.exe raised exception class EDatabase with message " Cannot perform this operation on an Opendatabase"

部份代码如下:
void __fastcall TfrmLog::InsertLogToDB(PLOGRECORD plr)
{

try{
LogQuery->Close();
LogQuery->SQL->Clear();
LogQuery->SQL->Add("Insert into log UserName,Type,Target,Operation) ");
LogQuery->SQL->Add(" values(:UserName,:Type,:Target,:Operation)");
LogQuery->ParamByName("UserName")->AsString=plr->strUser;
LogQuery->ParamByName("Type")->AsString=plr->strType;
LogQuery->ParamByName("Target")->AsString=plr->strTarget;
LogQuery->ParamByName("Operation")->AsString=plr->strOperation;
if(LogQuery->Prepared)
LogQuery->Prepare();
LogQuery->ExecSQL();
}
catch(...)
{
ShowMessage("Insert a record to DB failed!");
}

}


问题是,当我在启动设备时,连续插入记录时,第一条记录可以正常插入,当插入第二条记录时,需要重新连接数据库,连接后,出现上述错误提示。

当启动正常后,可以正常插入数据库,而且也不再提示重新连接的情况。不知道问题出在哪?各位GGJJDDMM,一定要帮我想想,先谢了:)
...全文
140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
火鸟33 2001-07-20
  • 打赏
  • 举报
回复
搞不懂,插入个纪录用这么多代码,真是的
try
{
LogQuery->SQL->Text=Format("Insert into log(UserName,Type,Target,Operation)values ('%s','%s','%s','%s') ",OPENARRAY(TVarRec,(plr->strUser,plr->strType,plr->strTarget,plr->strOperation)));
LogQuery->ExecSQL();
}
catch(...)
{
ShowMessage("Insert a record to DB failed!");
}


个人习惯不同
wolf416 2001-07-20
  • 打赏
  • 举报
回复
to luhongjun(过江项羽) 
当涉及到大量记录插入到一个表时,采用上面代码是否是一个好的办法呢?
wolf416 2001-07-20
  • 打赏
  • 举报
回复
to luhongjun(过江项羽) 
我将OperateTime字段去掉,可问题仍存在,
关键问题是,当我在启动设备时,连续插入记录时,第一条记录可以正常插入,当插入第二条记录时,需要重新连接数据库,连接后,出现上述错误提示。

当启动正常后,可以正常插入数据库,而且也不再提示重新连接的情况。

难道是因为插入太快会有影响吗?
luhongjun 2001-07-20
  • 打赏
  • 举报
回复
wolf416(人生如梦) :你把所有的字段先都加入,然后再往下讨论。
wolf416 2001-07-20
  • 打赏
  • 举报
回复
to luhongjun(过江项羽) 
我的OperateTime字段用的是系统的缺省时间,我想在Insert 中不指定,应该问题不大。
create table log
(
UserName varchar(20),
OperateTime DateTime ,
Type varchar(20),
Target varchar(20),
Operation varchar(100),
)

create default def_cur_date as getdate()
sp_bindefault def_cur_date, 'log.OperateTime'
wolf416 2001-07-20
  • 打赏
  • 举报
回复
谢谢各位!请我再试试,成功后再加分

另外,LogQuery->SQL->Add("Insert into log(UserName,Type,Target,Operation) ");只是显示有些问题,
to : yuyulily(打工仔) 
你说得对,不过问题关键可能不在这。
to luhongjun(过江项羽) 
让我再试试
yuyulily 2001-07-20
  • 打赏
  • 举报
回复
if(LogQuery->Prepared)
LogQuery->Prepare();
改成
if(!LogQuery->Prepared)
LogQuery->Prepare();
luhongjun 2001-07-20
  • 打赏
  • 举报
回复
你的问题是,使用Insert语句,不NULL的字段必须都加入,你没有都加入,就有Cannot perform this operation on an Opendatabase的提示。

最好你把所有的字段都加到Insert中。
wjzhuang 2001-07-20
  • 打赏
  • 举报
回复
如果是写错,编译应该同不过才是
难不成把 "Operation)" 当成一个字符串?
qin_wei 2001-07-20
  • 打赏
  • 举报
回复
ExecSQl不用Prepare!!!
Wingsun 2001-07-20
  • 打赏
  • 举报
回复
你写错了吧:
LogQuery->Close();
LogQuery->SQL->Clear();
LogQuery->SQL->Add("Insert into log(UserName,Type,Target,Operation) ");
LogQuery->SQL->Add(" values(:UserName,:Type,:Target,:Operation)");
LogQuery->ParamByName("UserName")->AsString=plr->strUser;
LogQuery->ParamByName("Type")->AsString=plr->strType;
LogQuery->ParamByName("Target")->AsString=plr->strTarget;
LogQuery->ParamByName("Operation")->AsString=plr->strOperation;
if(LogQuery->Prepared)
LogQuery->Prepare();
LogQuery->ExecSQL();
leeyansheng 2001-07-20
  • 打赏
  • 举报
回复
我来晚了吗?
wolf416 2001-07-20
  • 打赏
  • 举报
回复
各位,虽我的问题没能完全解决,但我仍感谢各位,领分!

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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