动态sql查询问题,急!!!(100分)

  • 主题发起人 主题发起人 steelg
  • 开始时间 开始时间
S

steelg

Unregistered / Unconfirmed
GUEST, unregistred user!
第一个问题是:
起始时间t1,终止时间t2。
我要得到的查询结果除t1至t2之间的记录外,还要包括这段记录集的前一个记录和后一个记录
请问如何实现?

第2个问题,我实在想不明白,相关代码如下:
with form1.Query1 do
begin
close;
sql.clear;
sql.add('select TM,Z from st_river_r_z');
sql.add('where stcd:=stcd and where tm between:tstart and:tend');
sql.add('order by tm asc');
parambyname('stcd').asstring:='50229350';
parambyname('tstart').asdatetime:=tstart;
parambyname('tend').asdatetime:=tend;
open;
end;

直接在with这行就出eaccessviolation 错误,我把with句中的.Query1 去掉、换到语段中间,就在Query1.close出eaccessviolation 错误
 
第一个条件为:
time<=t1 or time>=t2即可
第二个为:
sql.add('select TM,Z from st_river_r_z');
sql.add('where stcd=:stcd and where tm between :tstart and :tend');
 
可能我问题没表达清楚
第一个问题举例:
数据库原始记录如下:
t q
……
2004-9-5 8:00 10
2004-9-6 10:00 20
2004-9-8 7:00 15
2004-9-15 13:00 13
……
起始时间t1为2004-9-6,终止时间t2为2004-9-10,我想要得到的查询结果是上面4条记录,请问如何实现?

第二个问题到底是怎么回事啊,实在想不通!
 
select *
from Table
where (t > 2004-9-6 and t < 2004-9-10)
or t = (select Max(t) from t_Table where t < 2004-9-6)
or t = (select Min(t) from t_Table where t < 2004-9-10)

这样就可以得到你要记录了吧。

第二个问题是不是你只引用了form1,而没有创建过form1呢?
 
第二个问题说明你form1上的Query1还没创建实列.有可能是 你的这段语句放在form1的 oncreate事件中写的. 你可以加上
if assigned(form1.Query1) then
with form1.Query1 do
.....
第一个语句我想没办法用一条语句完成.
 
sql.add('where stcd:=stcd and where tm between:tstart and:tend');
有问题吧??
该是 sql.add('where stcd:=stcd and tm between:tstart and:tend');
 
suger第一个问题答案接受

第二个问题:
program代码中有Application.CreateForm(TForm1, Form1);这个,应该表示已经创建实例了吧?

另外,对象实例创建的creat(),括号中的参数我搞不懂怎么填?就拿我现在的代码来说:
type
TForm1 = class(TForm)
Database1: TDatabase;
Query1: TQuery;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
 
你这个例子 Query1是在Form1创建时自动创建的,问题时你这段代码时出现在那里的,是否是在创建 form1之前就有执行.
 
干脆我把全部代码贴出来吧

program input;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables;

type
TForm1 = class(TForm)
Database1: TDatabase;
Query1: TQuery;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
var

begin
assignfile(ft,'./计算时段.dat');
reset(ft);
readln(ft,tstart0);
readln(ft,tend0);
closefile(ft);
tstart:=strtodate(tstart0);
tend:=strtodate(tend0)+10;

with form1.Query1 do
begin
close;
sql.clear;
sql.add('select TM,Z from st_river_r_z');
sql.add('where stcd:=stcd and where tm between:tstart and:tend');
sql.add('order by tm asc');
parambyname('stcd').asstring:='50229350';
parambyname('tstart').asdatetime:=tstart;
parambyname('tend').asdatetime:=tend;
open;
end;





end.
 
为什么要用两次where ,你的语句有问题
 
我在with form1.Query1 do前加
Application.CreateForm(TForm1, Form1);,第二个问题解决

但又冒出新问题:
project input.exe raised exception class edbenineerror with message 'unknown user name or password.
[microsoft][odbc sql server driver][sql server] 用户'null'登陆失败。原因未与信任sql server连接相关联

我以前用access从来没碰到这种问题,这是第一次用sql server,请问这要如何解决?
 
你的form1没有创建
 
哥们,用临时表解决
 
唉,问题总是层出不穷啊,前头的问题都解决了,但程序一运行到open句,又跳出下面的错误:
project input.exe raised exception class edbenineerror with message “general sql error”[microsoft][odbc sql server driver][sql server] 第2行‘between@p2' 附近有语法错误

我程序运行中设置的tstart0为2004-6-15,tend0为2004-7-15,是从文本文件中读近来的,哪位大虾帮我看看到底是我代码哪里出问题了

btw,本人超级菜鸟啊……
 
多人接受答案了。
 
后退
顶部