请教一条数据库语句SQL?(100分)

  • 主题发起人 主题发起人 kristy811203
  • 开始时间 开始时间
K

kristy811203

Unregistered / Unconfirmed
GUEST, unregistred user!
下面有在delphi的程序中的一条SQL语句:
sSearch := 'select * from Expert where 专家ID in (' + sSearch + ') ' +
' Order by 组ID asc,专家ID asc';

其中:(' + sSearch + ')中的sSearch 是string类型,我想把它转换成int或者是double,因为(专家ID)是int类型,如果不改,提示有错误,不能运行。
请问应该如何解决,请大家帮我写一下,谢谢!
 
提示的信息是什么啊?是编译不过,还是运行时报SQL语句之行错误啊?
 
in 后面是子查询语句,如:专家ID in (select 专家ID from XXXX wher XXXX)
显然你的sSearch不是子查询语句,
改为:
sSearch := 'select * from Expert where 专家ID=' + sSearch +
' Order by 组ID asc,专家ID asc';
 
写成存储过程就可以传你想要的类型了,
如果你在程序中,好象就只能写成String类型的了
 
你跟踪一下sSearch,看看它的值。
这里关键是这个变量的值的问题。如果是int型的
那么应该是(1,2,3...)等等
如果是字符型的应该是('1', '2'...)
 
提示的信息是:
Project ExpertExtract.exe raised exception class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)'. Process stopped. Use Step or Run to continue.
 
请问如何写存储过程啊,我是个新手,不怎么会,请指教.
 
sSearch ,(值)具体是什么
 
sSearch再delphi里面应该象'1,2,3...' 这样就可以了
 
sSearch := 'select * from Expert where 专家ID in (' + sSearch + ') ' +
' Order by 组ID asc,专家ID asc';
其中sSearch如何得来,是否如flysand所说
 
sSearch 必须是string型的,否则不能用。为了避免sSearch为空值,')'要改为',-1)'即:
sSearch := 'select * from Expert where 专家ID in (' + sSearch
+ ',-1) Order by 组ID,专家ID';
 
我把源码给你,你帮我看一下,谢谢!
procedure TfrmExtract1.Button1Click(Sender: TObject);
var
sGroupId, sSearch, sReturn :string;
iOptioncount,IExtracount :integer;
tempArray1: array of integer;
i :integer;
begin
sReturn :='';
sSearch :='';
GsSearch :='';
//浏览ExpertGroup表
ADOTable1.First;
while not ADOTable1.Eof do
begin
SGroupId :=ADOTable1.FieldValues['组ID'];
IOptioncount :=ADOTable1.FieldValues['总人数'];
IExtracount :=ADOTable1.FieldValues['抽选人数'];
if IExtracount <=0 then
begin
ADOTable1.Next;
continue; // 抽选人数为0,则跳出本次循环
end;
if IExtracount > IOptioncount then
begin
Application.MessageBox('抽选人数不能大于总人数, 请重新输入. ', '提示信息', MB_OK);
exit;
end;
//计算出每组选中的专家总人数
with ADOQuery1 do begin
Close;
Connection :=frmMain.ADOConnection1;
SQL.Clear;
SQL.Add('select * from Expert where 组ID like :GroupID and 选中= True and 状态= :Status Order by 组ID asc,专家ID asc');
Parameters.ParamByName('GroupID').Value := SGroupId;
Parameters.ParamByName('Status').Value := '正常';
Prepared :=true;
Open; //select语句需用Open方法执行
end;
if IExtracount > ADOQuery1.RecordCount then
begin
Application.MessageBox('抽选人数不能大于该组选中的专家总人数, 请重新输入. ', '提示信息', MB_OK);
exit;
end;
setlength(TempArray1,IExtracount); //根据抽选人数为数组分配内存空间
//调用抽取函数, ADOQuery1.RecordCount是有效的专家总人数
sReturn :=ExtractFunc(ADOQuery1.RecordCount,IExtracount,TempArray1);

for i :=low(TempArray1) to high(TempArray1) do
begin
ADOQuery1.first;
ADOQuery1.MoveBy(TempArray1-1);
//构造查询字符串
sSearch :=sSearch + ''''+ ADOQuery1.FieldValues['专家ID'] + ''',';
GsSearch := GsSearch + '专家ID = ' + QuotedStr(ADOQuery1.FieldValues['专家ID']) + ' OR ';
end;
ADOTable1.Next;
end;
ADOTable1.First; //完成浏览ExpertGroup表
tempArray1 :=nil; //释放临时数组内存空间
if sSearch = '' then //如果没有构造查询字符串,则构造
begin
sSearch :='''' + '''';
GsSearch :='专家ID = ' + QuotedStr('')
end
else begin
sSearch :=copy(sSearch,1,length(sSearch)-1); //去掉结尾的逗号
GsSearch :=copy(GsSearch,1,length(GsSearch)-3); //去掉结尾的OR
end;
sSearch := 'select * from Expert where 专家ID in (' + sSearch + ') ' +
' Order by 组ID asc,专家ID asc';
//创建抽取结果窗口
frmExtractResult :=TfrmExtractResult.Create(Application);
with frmExtractResult.ADOQryResult do begin
Close;
SQL.Clear;
SQL.Add(sSearch);
Prepared :=true;
Open; //select语句需用Open方法执行
end;
frmExtractResult.ShowModal;
frmExtract1Rep :=TfrmExtract1Rep.Create(Application);
with frmExtract1Rep.ADOTable1 do begin
Close;
Connection:=frmMain.ADOConnection1;
TableName:='Expert'; //数据表名称!
Filtered := False;
Filter :=GsSearch ;
Filtered :=true;
Open; //打开数据库表
end;
button3.Enabled :=true;end;
 
抱歉...

请跟踪一下,看一下错误在哪好吗?

我认为错误不是出在你说的那里
 
不行啊,还是提示上面的错误信息:
Project ExpertExtract.exe raised exception class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)'. Process stopped. Use Step or Run to continue.
 
我跟踪了一下,错误出现在这条语句
sSearch :=sSearch + ''''+ ADOQuery1.FieldValues['专家ID'] + ''',';
请帮我再看一下
 
把这句改为:
sSearch :=sSearch + ''''+ inttostr(ADOQuery1.Fieldbyname('专家ID').value)+ ''',';
 
sSearch的值的不唯一。错误就在这里
 
请问应该如何解决这个问题?
 
把这句改为:
sSearch :=sSearch + ''''+ inttostr(ADOQuery1.Fieldbyname('专家ID').value)+ ''',';

还是不行吗?
 
//构造查询字符串
sSearch :=sSearch + ADOQuery1.FieldValues['专家ID'] + ',';
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部