首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphiSQL连接数太多了,怎样才能减少

2012-02-04 
delphi高手进!SQL连接数太多了,怎样才能减少!自己写了一个库房管理系统,连接数据库用的都是ADOQuery,今天

delphi高手进!SQL连接数太多了,怎样才能减少!
自己写了一个库房管理系统,连接数据库用的都是ADOQuery,今天用SQL查询分析其执行exec sp_who 发现连接数好多啊,就我一个系统,进程就1000个!! 我猜可能是我写程序的原因
因为delphi里ADOQuery连接都是这样写的
先 close
然后 sql.clear sql.add
然后Open 

估计连接数过多就是因为open以后没有close吧
但是刚才我open以后全部close了 ,sql连接进程还是那么多没变呀?

请问高手这怎么回事啊?我应该怎么做才能减少连接数,提高数据库执行效率呢?

[解决办法]

探讨

丟,,,,,你用一個ADOConnection 不就行了, ADOQuery全部連接ADOConnection

每個ADOQuery你都去連接,不死才怪。

[解决办法]
exec sp_who 得到的不是连接数,是处理进程,只要没有锁死的是就没影响,反而是提升数据库执行效率的
[解决办法]
var
ADOConnection1:TADOConnection;
adoquery1,adoquery2:Tadoquery;
begin
try
try
adoconnection1:=Tadoconnection.Create(Self);
adoconnection1.LoginPrompt:=false;
adoconnection1.KeepConnection:=false;
ADOConnection1.ConnectionString:=connectStr;
adoconnection1.Open;

ADOQuery1:=TADOquery.Create(self);
ADOQuery1.Connection:=Adoconnection1;

ADOQuery2:=TADOquery.Create(self);
ADOQuery2.Connection:=Adoconnection1;

adoconnection1.BeginTrans;

//删除进货明细表
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('delete from jhmxb where id=:id');
adoquery1.Parameters.ParamByName('id').Value:=Trim(Edit22.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;

//修改进货汇总表
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('update jhhzb set jhje=jhje-:jhje,wfje=wfje-:wfje where djh=:djh');
adoquery1.Parameters.ParamByName('jhje').Value:=trim(edit18.Text);
adoquery1.Parameters.ParamByName('wfje').Value:=trim(edit18.Text);
adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;

//明细表是否删除完毕
adoquery2.Close;
adoquery2.sql.clear;
adoquery2.sql.add('select * from jhmxb where djh=:djh');
adoquery2.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery2.Prepared;
adoquery2.open;
if adoquery2.RecordCount=0 then
begin
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.sql.add('delete from jhhzb where djh=:djh');
adoquery1.Parameters.ParamByName('djh').Value:=trim(edit1.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;
end;

//库存明细表
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('update kcb set jhs=jhs-:jhs,kcs=kcs-:kcs where mc=:mc and jj=:jj');
adoquery1.Parameters.ParamByName('jhs').Value:=Trim(Edit21.Text);
adoquery1.Parameters.ParamByName('kcs').Value:=Trim(Edit21.Text);
adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);


adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;

adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('update kcb set jhje=jhs*jj,kcje=kcs*jj where mc=:mc and jj=:jj');
adoquery1.Parameters.ParamByName('mc').Value:=Trim(Edit15.Text);
adoquery1.Parameters.ParamByName('jj').Value:=Trim(Edit20.Text);
adoquery1.Prepared;
adoquery1.ExecSQL;

adoconnection1.CommitTrans;
except
adoconnection1.RollbackTrans;
application.MessageBox('当前信息资料保存失败请确定之后重新再试','提示',mb_ok+mb_iconstop);
end;
finally
jhmxb.ADOquery1.Close;
ADOQuery1.Close;
ADOQuery1.Free;
ADOQuery2.Close;
ADOQuery2.Free;
adoconnection1.Close;
adoconnection1.Free;
Self.Close;
end;

热点排行