sql简单问题,菜鸟在线等,毕业设计啊,就要交了,高手也不一定能解决.(100分)

  • 主题发起人 主题发起人 chefee
  • 开始时间 开始时间
C

chefee

Unregistered / Unconfirmed
GUEST, unregistred user!
多步OLE同步问题,看了很多前辈这个问题,改来改去还是解决不了,我测试了是SQL语句的问题,该怎么写呢?
我是SQL放在INI文件里调用的,语句如下:
sql3=select distinct scoret.学号,姓名,性别,departmentt.系别,classt.班级,courseinfort.学期,课程编号,课程名,成绩,学分,补考1,补考2,出生日期,sum(cast(学分 as integer))as 总学分

from scoret,stuinfort,courseinfort,classt,departmentt

where scoret.学号=stuinfort.学号 and scoret.课程编号=courseinfort.编号 and scoret.学号 like(classt.编号+'%') and stuinfort.系别=departmentt.编号 and departmentt.系别=:xb and classt.班级=:bj and scoret.学号=:xh

group by scoret.学号,姓名,性别,departmentt.系别,classt.班级,courseinfort.学期,课程编号,课程名,成绩,学分,补考1,补考2,出生日期
表中涉及的各字段均为CHAR类型 如果我把要传递的参数用具体的值代替就没问题

即:departmentt.系别='计算机系' ,分析原因主要是'号不能从程序正确写到SQL中?

用#39代替还是出现OLE多步错误.
程序中调用:
ClientDataSet1.Close;
ClientDataSet1.DataRequest(sql3);
ClientDataSet1.Params.ParamByName('xb').asstring:=trim(xpcombobox1.Text);
ClientDataSet1.Params.ParamByName('bj').asstring:=trim(xpcombobox2.Text);
ClientDataSet1.Params.ParamByName('xh').asstring:=trim(xpcombobox3.Text);
//showmessage(ClientDataSet1.Params.ParamByName('xb').Value+ClientDataSet1.Params.ParamByName('bj').Value+ClientDataSet1.Params.ParamByName('xh').Value+sql3);

ClientDataSet1.Open;

if ClientDataSet1.RecordCount=0 then
showmessage('对不起,没有找到记录,请重新选择打印条件。')
else
self.frReport1.ShowReport;
end;
end
except
showmessage('sql3语句出错');
exit;

还有ClientDataSet有分组功能,我有如下需要应该怎么实现:
需要提取信息如下:
系别 班级 姓名 课程 成绩 学期 学分 ...
计算机 计算机应用 成达到 电子 80 1 2
计算机 计算机应用 成达到 是似的 71 2 5

在fastreport 中要根据 学期 的值添充信息 .注: 即毕业成绩汇总表
我的下下策是有几个学期就用几个ClientDataSet,用SQL根据学期不同写到各个ClientDataSet 中 ,但是听说每用一个ClientDataSet,就增加一个MIDAS.DLL
我希望只用一个ClientDataSet 就能完成.

分不多,希望各位不令赐教,我的QQ:25017101
 
我晕~你写这么长~看都要半天~有谁会有这么多的时间去看你的
 
给你点建议,对于复杂的查询你可以把各个关键查询写成视图,然后查询视图,这样看起来也比较清晰。
 
各位大哥,占用点时间, 长了点,主要是SQL语句长了,急待解决的就是第一个问题.
多步OLE同步,
谢谢顶的兄弟
 
to goostudio
谢谢,我也想过,但找不到这方面资料,在SQLSERVER中创建视图,程序中怎么调用,可以传参数吗?
希望能赐一段代码.感激不尽,急啊.
 
救命啊,快来人啊~~~可恶的台风,可恶的问题.
SQL中能用ASCII码代替吗?
 
要把问题顶上去,各位大哥帮帮忙.
 
看的朋友,即使问题不明白,也希望给些,上面代码规范与否及改进建议,谢谢.
总觉得自己写的代码很长.
 
60多人看,难道就没人愿意帮忙的?
 
同意goostudio的看法,写成视图后,程序就像查询表一样来查询啊。
建议你字段命名最好用英文。
 
不太明白您的意思,
“如果我把要传递的参数用具体的值代替就没问题,即:departmentt.系别='计算机系' ,分析原因主要是'号不能从程序正确写到SQL中?”
是什么意思?怎么样会出问题呀?
 
谢谢楼上几位好兄台,表名用中文不是我说了算,原来我设计的是英文表,项目老师给改了,

原来
departmentt.系别=:xb xb参数通过代码复值,
即:ClientDataSet1.Params.ParamByName('xb').asstring:=#39+trim(xpcombobox1.Text)+#39;
这样还是多步OLE问题

于是我就测试不用参数,直接写SQL departmentt.系别='计算机系'就没问题了
用查询分析器把SQL3 执行,当然参数用实值代替就没问题 ,问题是departmentt.系别=计算机系 就抱错"没有'计算机系'列名 而scoret.学号=03030301 就没问题,(少了'号scoret.学号 没关系,departmentt.系别 却报错)所以我猜是由于程序中没有把'即#39传替到SQL语句中.
 
ClientDataSet1.Params.ParamByName('xb').asstring:=#39+trim(xpcombobox1.Text)+#39;
改成这个试试
ClientDataSet1.Params.ParamByName('xb').asstring:=Quotedstr(trim(xpcombobox1.Text));
 
这个好像是很简单的问题啊,无论用'计算机系'还是 :=#39+trim(xpcombobox1.Text)+#39;
应该都没问题吧。

可能你的dataset对象写错吧?

departmentt.系别=:xb xb参数通过代码复值,
即:ClientDataSet1.Params.ParamByName('xb').asstring:=#39+trim(xpcombobox1.Text)+#39;

??用 ClientDataSet1的params? 一般好像都是另外用一个BDE的QUERY得到SQL SERVER的数据后再写到ClientDataSet中,不过就要定义每个ClientDataSet的字段,比较麻烦。
 
对不起 刚才我以为你用的是 BDEClientDataSet,你用的是ClientDataSet就不是很清楚。

献丑了。
 
谢谢各位大侠关注,感激回帖的朋友.
to logingyw
这个还是多部OLE错误,

to jenhon
但是它就报错,狂郁闷.

这个是MIDAS模式的,C段不用QUERY
 
to jenhon

大侠真谦虚,小弟诚服.
还望多多指教.
 
用format函数吧,如:
const
ss='select s% from s% where s% = ''s%''';

....
SQL.Add(Format(SS,[fName,talName,conName,conVal]));
....

这样可以传递参数,包括表、字段、变量值
如果参数值不是字符串,去掉引号
 
有没有试试logingyw的方法 
ClientDataSet1.Params.ParamByName('xb').asstring:=Quotedstr(trim(xpcombobox1.Text));
 
ClientDataSet1.Close;
//加这两句
ClientDataSet1.Params.Clear;
ClientDataSet1.Refresh;
{**********************}
ClientDataSet1.DataRequest(sql3);
............
 
后退
顶部