ADO+ADOQuery:看这段代码错误!一个窗体向另一个打印窗体传递sql参数! (50分)

J

jtys

Unregistered / Unconfirmed
GUEST, unregistred user!
主  题: Access+ADDOQuery:各位请帮我分析下面这段代码错误!
作  者: dqwc (江天一色)
等  级:
信 誉 值: 100
所属论坛: C++ Builder DataBase
问题点数: 50
回复次数: 5
发表时间: 2003-4-23 21:10:54

void __fastcall TForm5::BitBtn16Click(TObject *Sender)
{
AnsiString s;
s="select * From cdk Where 购带时间 between #2002-1-1#
and #2002-12-31#";
//传送信息到StatusBus
Form1 ->StatusBar1 ->SimpleText=" 正在将查询结果生成报表,需要一定时间,请稍候。。。";
Form6=new TForm6(Application);
//激活第1页
Form6 -> PageControl1 ->ActivePageIndex=0;
Form6 ->ADOQuery1 ->Close();
Form6 ->ADOQuery1 ->SQL ->Clear();
Form6 ->ADOQuery1 ->SQL ->Add(s);
// Form6 ->ADOQuery1 ->SQL ->Add(Form5 ->Memo1 ->Text);
Form6 ->ADOQuery1 ->Open();
Form6 ->QuickRep1 ->Preview();
delete Form6;
}

显示的错误为:
[C++ Error] Unit5.cpp(246): E2380 Unterminated string or character constant
[C++ Error] Unit5.cpp(247): E2379 Statement missing ;
[C++ Error] Unit5.cpp(247): E2206 Illegal character '#' (0x23)
[C++ Error] Unit5.cpp(247): E2206 Illegal character '#' (0x23)
[C++ Error] Unit5.cpp(247): E2380 Unterminated string or character constant
各位:怎么解决?谢谢!

回复人: Libran() ( ) 信誉:125 2003-04-23 21:28:00 得分:0
AnsiString s;
s="select * From cdk Where 购带时间 between #2002-1-1# and #2002-12-31#";//不要换行
//传送信息到StatBus
...


回复人: Libran() ( ) 信誉:125 2003-04-23 21:31:00 得分:0
一定要换的话:
AnsiString s;
s="select * From cdk Where 购带时间 between #2002-1-1# /
and #2002-12-31#";
//传送信息到StatBus
...
注意换行时结尾处要加上“ /”

回复人: gfh_79_0(ghf) ( ) 信誉:100 2003-04-23 21:31:00 得分:0
把s="select * From cdk Where 购带时间 between #2002-1-1#
and #2002-12-31#";
写成一行。
或者用传递参数的方法。

回复人: dqwc(江天一色) ( ) 信誉:100 2003-04-23 23:35:00 得分:0
谢谢各位,问题解决。
但是我这样修改s时出现运行期错误:
s=Form5 ->Memo1 ->Text;
(Memo1里是我输入的select * From cdk Where 购带时间 between #2002-1-1#
and #2002-12-31#)
运行期错误提示为Syntax error in WHERE clause,
难道Memo1传递给s又传递给ADOQuery1时出现同样错误,where之后的语句传递不过去?
谢谢!
----------------------------------------------
回复人: sczyq(我又...........) ( ) 信誉:97 2003-04-23 23:43:00 得分:0

还有
Form6=new TForm6(Application);
应为:
TForm6 *Form6=new TForm6(Application);



 
AnsiString s;
//试试字段名称加'',access处理中文字段名称的问题
s="select * From cdk Where '购带时间' between #2002-1-1# and #2002-12-31#";
 
问题出在#上面,我不熟悉C++,可能这是个特殊字符,在字符串中不能直接使用。
 
s="select * From cdk Where 购带时间 between /'2002-1-1/'
and /'2002-12-31/'";
 
各位大虾,我前面的问题已经解决,后面的问题是
AnsiString s;
s=Form5 ->Memo1 ->Text;
把这个s传递给Form6 ->ADOQuery ->sql ->Add(s);
后能通过编译,但运行后在Form5 的Memo1里面输入
select * From cdk Where 购带时间 between #2002-1-1#
and #2002-12-31#
后,不能实现打印预览页面,错误提示为Syntax error in WHERE clause。
问题的核心是动态调用打印窗体实现查询结果打印!
 
Memo1里面有沒有一些是類似于" '"的(單引號),如果有的話就不行
select * From cdk Where 购带时间 between #2002-1-1#
and #2002-12-31#
不要通過Memo傳遞能執行嗎?
 
select * from table where thedate between '2002-04-11' and '2003-4-5'
 
根据大家的帮助和自己的琢磨,看来可以解决一个窗体的查询结果怎样导出打印窗体的问题
了,问题的关键还是Memo1的文本导出到sql中存在的换行问题!
int1,j;
i=Form5 ->Lines ->Count;
......
Form6 ->ADOQuery1 ->Close();
Form6 ->ADOQuery1 ->SQL ->Clear();
for (j=0;j<i;j++)
{
Form6 ->ADOQuery ->SQL ->Add(Form5 ->Lines ->Strings[j];
}
Form6 ->ADOQuery1 ->Open();
Form6 ->QuickRep1 ->Preview();
delete Form6;
这段代码应该可以帮助一些富翁解决查询结果导出打印窗体的问题!
 
大家有什么好的方法请告知!
 
回车、换行是 #13,#10(字符型) , 我好久没用过C语言了,我用DELPHI的规则写了
//在得到最后的sql语句之后,
var s:string(255);
.....
s:=adoquery1.sql.text;
adoquery1.sql.Clear;
for i:=1 to Length(s)do
if s<> #13 or s<>#10 then

adoquery1.Sql.add(s)
else
adoquery1.sql.add(' ');
//多加些空格没有坏处







 
很抱歉!问题还是没有解决!还市提示:where字句语法错误!
奇怪的是我在Form5里用
ADOQuery ->SQL ->Add(Memo1 ->Text);是完全可以也可以查询的,
但是把Form5 ->Memo1 ->Text加到Form6(打印窗体)后
Form6 ->ADOQuery ->SQL ->Add(Form5 ->Text);
就提示where字句语法错误!
关于怎样把查询结果打印出来,请大家继续讨论!
 
顶部