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

用ado+acess+bcb做数据的插入操作,速度很慢,请帮忙,谢谢!

wanglei9802 2004-12-27 09:50:17
用ado+acess+bcb做数据的插入操作,速度很慢,请帮忙,谢谢!

void __fastcall TSql::InserSgyd(AnsiString cpzh,AnsiString cpfl,AnsiString jszh,AnsiString rq,AnsiString sj,int sd,float x,AnsiString rqd,AnsiString clsbh,AnsiString s)
{
TADOQuery *adoInserSgyd;
try
{
adoInserSgyd = new TADOQuery(NULL);
adoInserSgyd->Connection=mainfrm->ADOConnection2;
adoInserSgyd->Close();
adoInserSgyd->SQL->Clear();
adoInserSgyd->SQL->Add("insert into sgydb (cpzh,cpfl,jszh,rq,sj,sd,x,zdxh,zdxh1,rqd,clsbh,jjd,jjd1,yjd,yjd1,zd,zd1,yd,yd1,kmxh,kmxh1,wd,wd1,cs,cs1)");
adoInserSgyd->SQL->Add("values(:cpzh,:cpfl,:jszh,:rq,:sj,:sd,:x,:zdxh,:zdxh1,:rqd,:clsbh,:jjd,:jjd1,:yjd,:yjd1,:zd,:zd1,:yd,:yd1,:kmxh,:kmxh1,:wd,:wd1,:cs,:cs1)");
adoInserSgyd->Parameters->ParamByName("cpzh")->Value=cpzh;
adoInserSgyd->Parameters->ParamByName("cpfl")->Value=cpfl;
//adoInserSgyd->Parameters->ParamByName("sjdm")->Value=sjdm;
adoInserSgyd->Parameters->ParamByName("jszh")->Value=jszh;
adoInserSgyd->Parameters->ParamByName("rq")->Value=rq;
adoInserSgyd->Parameters->ParamByName("sj")->Value=sj;
adoInserSgyd->Parameters->ParamByName("sd")->Value=sd;
adoInserSgyd->Parameters->ParamByName("x")->Value=x;
if(s.SubString(1,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("zdxh")->Value=290;
adoInserSgyd->Parameters->ParamByName("zdxh1")->Value=true;
}
else if(s.SubString(1,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("zdxh")->Value=0;
adoInserSgyd->Parameters->ParamByName("zdxh1")->Value=false;
}
adoInserSgyd->Parameters->ParamByName("rqd")->Value=rqd;
adoInserSgyd->Parameters->ParamByName("clsbh")->Value=clsbh;
if(s.SubString(2,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("jjd")->Value=160;
adoInserSgyd->Parameters->ParamByName("jjd1")->Value=true;
}
else if(s.SubString(2,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("jjd")->Value=0;
adoInserSgyd->Parameters->ParamByName("jjd1")->Value=false;
}
if(s.SubString(3,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("yjd")->Value=180;
adoInserSgyd->Parameters->ParamByName("yjd1")->Value=true;
}
else if(s.SubString(3,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("yjd")->Value=0;
adoInserSgyd->Parameters->ParamByName("yjd1")->Value=false;
}
if(s.SubString(4,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("zd")->Value=200;
adoInserSgyd->Parameters->ParamByName("zd1")->Value=true;
}
else if(s.SubString(4,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("zd")->Value=0;
adoInserSgyd->Parameters->ParamByName("zd1")->Value=false;
}
if(s.SubString(5,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("yd")->Value=220;
adoInserSgyd->Parameters->ParamByName("yd1")->Value=true;
}
else if(s.SubString(5,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("yd")->Value=0;
adoInserSgyd->Parameters->ParamByName("yd1")->Value=false;
}
if(s.SubString(6,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("kmxh")->Value=240;
adoInserSgyd->Parameters->ParamByName("kmxh1")->Value=true;
}
else if(s.SubString(6,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("kmxh")->Value=0;
adoInserSgyd->Parameters->ParamByName("kmxh1")->Value=false;
}
if(s.SubString(7,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("wd")->Value=260;
adoInserSgyd->Parameters->ParamByName("wd1")->Value=true;
}
else if(s.SubString(7,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("wd")->Value=0;
adoInserSgyd->Parameters->ParamByName("wd1")->Value=false;
}
if(s.SubString(8,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("cs")->Value=280;
adoInserSgyd->Parameters->ParamByName("cs1")->Value=true;
}
else if(s.SubString(8,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("cs")->Value=0;
adoInserSgyd->Parameters->ParamByName("cs1")->Value=false;
}
adoInserSgyd->ExecSQL();
}
__finally
{
adoInserSgyd->Free();
}
}
...全文
95 点赞 收藏 10
写回复
10 条回复
jb9802 2004年12月29日
直接用语名不能提高速度吧,很post()快很多
回复 点赞
jixiaoqiang 2004年12月29日
各个字段尽量设计的合理点,字符串长度尽量够用就行,不要臃肿。

除了这,你想用SQL语句提高执行速度,估计很难。提醒一下,别钻牛角了

使用DAO 3.51试一下,不过这会牺牲标准的SQL语法。或者换个驱动试试?
回复 点赞
jixiaoqiang 2004年12月29日
不知道你的慢到什么程度? 难道插入一条需要几秒钟? 你的程序需要执行多快?

还是你的机器速度慢?
回复 点赞
真如实观 2004年12月29日
谁说“CB操作Access库就比较慢”了,我怎么快得要命呢?
我从来不这样用过。
回复 点赞
wanglei9802 2004年12月29日
重复的记录是先判断好了的,不用考虑重复的记录,你现在这种方法并不能提高插入的速度
回复 点赞
jevin8011 2004年12月29日
CB操作Access库就比较慢
回复 点赞
jixiaoqiang 2004年12月29日
用搞这么复杂吗?
放个ADOConnection控件ADOConn1,放个ADOCommand控件ADOCmd1.
以下写个大概意思,不一定能运行.但格式是这样的.

ADOConn1->ConnectionString=""; //连接字符串自己写吧,不写了
ADOCmd1->Connection=ADOConn1;
ADOConn1->Open();

ADOCmd1->CommandText="insert into sgydb (cpzh,cpfl,jszh,rq,sj,sd,x,zdxh,zdxh1,rqd,clsbh,jjd,jjd1,yjd,yjd1,zd,zd1,yd,yd1,kmxh,kmxh1,wd,wd1,cs,cs1) values ('" + Edit1->Text + "','" + Edit2->Text + "','" + Edit3->Text + "','" + ...........+ EditX->Text + "')";
if(ADOConn1->Connected)
{
ADOCmd1->Execute();
ShowMessage("插入成功");
}
else
ShowMessage("连接数据库失败!");

你的插入语句还有问题,如果数据库中存在同样的记录,你用Insert into 会出错。应该在插入之前判断是否有重的记录,或者在库中设定ID自动增长(这种方法不推荐,因为数据库中重复记录不报错,数据库会很大)

访问Accesss时使用SQL语句的注意:
1。各项之间最好用单引号引住,除了整型的不用.最好都用单引号
2。各字段名如果与关键字重复,字段名必须用[]括起来
回复 点赞
wanglei9802 2004年12月27日
void __fastcall TSql::InserSgyd(AnsiString cpzh,AnsiString cpfl,AnsiString jszh,AnsiString rq,AnsiString sj,int sd,float x,AnsiString rqd,AnsiString clsbh,AnsiString s)
{
TADOQuery *adoInserSgyd;
try
{
adoInserSgyd = new TADOQuery(NULL);
adoInserSgyd->Connection=mainfrm->ADOConnection2;
adoInserSgyd->Close();
adoInserSgyd->SQL->Clear();
adoInserSgyd->SQL->Add("insert into sgydb,cpzh,cpfl,jszh,rq,sj,sd,x,zdxh,zdxh1,rqd,clsbh,jjd,jjd1,yjd,yjd1,zd,zd1,yd,yd1,kmxh,kmxh1,wd,wd1,cs,cs1)");
adoInserSgyd->SQL->Add("values(:cpzh,:cpfl,:jszh,:rq,:sj,:sd,:x,:zdxh,:zdxh1,:rqd,:clsbh,:jjd,:jjd1,:yjd,:yjd1,:zd,:zd1,:yd,:yd1,:kmxh,:kmxh1,:wd,:wd1,:cs,:cs1)");
adoInserSgyd->Parameters->ParamByName("cpzh")->Value=cpzh;
adoInserSgyd->Parameters->ParamByName("cpfl")->Value=cpfl;
//adoInserSgyd->Parameters->ParamByName("sjdm")->Value=sjdm;
adoInserSgyd->Parameters->ParamByName("jszh")->Value=jszh;
adoInserSgyd->Parameters->ParamByName("rq")->Value=rq;
adoInserSgyd->Parameters->ParamByName("sj")->Value=sj;
adoInserSgyd->Parameters->ParamByName("sd")->Value=sd;
adoInserSgyd->Parameters->ParamByName("x")->Value=x;
if(s.SubString(1,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("zdxh")->Value=290;
adoInserSgyd->Parameters->ParamByName("zdxh1")->Value=true;
}
else if(s.SubString(1,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("zdxh")->Value=0;
adoInserSgyd->Parameters->ParamByName("zdxh1")->Value=false;
}
adoInserSgyd->Parameters->ParamByName("rqd")->Value=rqd;
adoInserSgyd->Parameters->ParamByName("clsbh")->Value=clsbh;
if(s.SubString(2,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("jjd")->Value=160;
adoInserSgyd->Parameters->ParamByName("jjd1")->Value=true;
}
else if(s.SubString(2,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("jjd")->Value=0;
adoInserSgyd->Parameters->ParamByName("jjd1")->Value=false;
}
if(s.SubString(3,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("yjd")->Value=180;
adoInserSgyd->Parameters->ParamByName("yjd1")->Value=true;
}
else if(s.SubString(3,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("yjd")->Value=0;
adoInserSgyd->Parameters->ParamByName("yjd1")->Value=false;
}
if(s.SubString(4,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("zd")->Value=200;
adoInserSgyd->Parameters->ParamByName("zd1")->Value=true;
}
else if(s.SubString(4,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("zd")->Value=0;
adoInserSgyd->Parameters->ParamByName("zd1")->Value=false;
}
if(s.SubString(5,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("yd")->Value=220;
adoInserSgyd->Parameters->ParamByName("yd1")->Value=true;
}
else if(s.SubString(5,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("yd")->Value=0;
doInserSgyd->Parameters->ParamByName("yd1")->Value=false;
}
if(s.SubString(6,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("kmxh")->Value=240;
adoInserSgyd->Parameters->ParamByName("kmxh1")->Value=true;
}
else if(s.SubString(6,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("kmxh")->Value=0;
adoInserSgyd->Parameters->ParamByName("kmxh1")->Value=false;
}
if(s.SubString(7,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("wd")->Value=260;
adoInserSgyd->Parameters->ParamByName("wd1")->Value=true;
}
else if(s.SubString(7,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("wd")->Value=0;
adoInserSgyd->Parameters->ParamByName("wd1")->Value=false;
}
if(s.SubString(8,1)=="1")
{
adoInserSgyd->Parameters->ParamByName("cs")->Value=280;
adoInserSgyd->Parameters->ParamByName("cs1")->Value=true;
}
else if(s.SubString(8,1)=="0")
{
adoInserSgyd->Parameters->ParamByName("cs")->Value=0;
adoInserSgyd->Parameters->ParamByName("cs1")->Value=false;
}
adoInserSgyd->ExecSQL();
}
__finally
{
adoInserSgyd->Free();
}
}
回复 点赞
h98458 2004年12月27日
能不能先整理你的代码再发上来?
好乱。。。
回复 点赞
jb9802 2004年12月27日
BCB中如果用Insert 语句一个个插入本地库(ACCESS)是非常慢的(SQL就很快), 用控件自身的,Appand() Pos(); 会快很多倍, 如果后台是SQL就没有这个问题。
回复 点赞
发动态
发帖子
C++ Builder
创建于2007-08-02

2563

社区成员

10.2w+

社区内容

C++ Builder相关内容讨论区
社区公告
暂无公告