两个数据库的问题!(100分)

  • 主题发起人 主题发起人 hoir
  • 开始时间 开始时间
H

hoir

Unregistered / Unconfirmed
GUEST, unregistred user!
对于这一段程序:
Active := False;
UnPrepare;
SQL.Clear;
SQL.Add('SELECT * FROM "TipLib.DB"');
SQL.Add('WHERE TipTitle LIKE :SearchParam');
Params[0].AsString := '%' +LIBMainForm.EditSearch.Text + '%';
CurrentSQL:=SQL.GetText;
if AddSQL<>'' then
SQL.Add(AddSQL);
Prepare;
ExecSQL;
Active := True;

1、每回运行中第一次查询时会出现异常:
Project DPro.exe raised exception class EAccessViolation
with message 'Access violation at address 4C637568 in module
'idsql32.dll'. Read of address 013E0618'.Process stopped.
Use Step or Run to continue.
以后再查询就没问题了。
问题会出在哪儿呢?

2、用SQL的‘order by’排序好象很慢!有快一点的方法吗?
 
补充一下:
1、上面的程序是用来查询一个memo字段的,如果用来查询其他类型的字段就没有问题。
如果先查询一下其他类型的字段再回来查这个memo也没有问题。我想可能是第一次查
询时有哪儿没有初始化?很想不通,请大家帮忙!
 
对返回数据集的SQL,用ExecSQL恐怕不行吧。
 
1.在SQL.ADDSQL之前加一条:sql.clear试一下。
2.将要排序的字段加一个索引。
 
不用execSql,用open;
 
不用EXECSQL,用open好象不行。
有更好的办法吗?大家帮帮忙啊!
 
改一下:
Active := False;
UnPrepare;//try if delete this statement
SQL.Clear;
SQL.Add('SELECT * FROM "TipLib.DB"');
SQL.Add('WHERE TipTitle LIKE %' +LIBMainForm.EditSearch.Text + '%');
CurrentSQL:=SQL.GetText;
if AddSQL<>'' then
SQL.Add(AddSQL);
Prepare;
Open;

如果要动态建立参数,可能需要AddParam什么的?反正ADO是要的,不知道你用的是不是BDE
 
CJ:
问题出在Param上,与Unprepare好象无关。
我用String拼接出AddSQL就不会出错!

但是,这是为什么?查询memo字段有问题,如果用来查询
其他类型的字段就没有问题?先查询一下其他类型的字段
再来查这个memo也没有问题?
 
你这段程序根本不全呀,addsql,currentsql在哪里定义的,何处赋值过,
currentsql应该是个pchar,addsql又影响到sql内容,没有这些怎么纠错?
 
to CJ:
如果需要AddParam,那查询其他类型的字段怎么没有问题?

to 温柔一刀
sorry,
AddSQL,CurrentSQL:String;//都是全局的
AddSQL的内容是'order by xxxx',是在排序语句赋值的。
CurrentSQL是用来储存当前SQL语句供以后排序用的,这里没用。

我是这样想的,可能这种方法不好:
排序的时候用CurrentSQL+AddSQL作为SQL.text,可以对当前的查询结果排序。
查询的时候仍然要照顾到先前的排序方式,所以再在用于查询的SQL后加上AddSQL。

查询其他字段(chars)的语句和这里没有区别。
 
我估计是你程序结构的问题,好象不存在第一次/第二次的问题啊?
你在打开数据库前,用一个
showmessage(sql.gettext);看看
我记得ADO是要AddParams的
 
多人接受答案了。
 
后退
顶部