我的程序是这样写的:
with Adoquery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:sj1)');
Parameters.ParamByName('sj1').Value:=DateTimePicker2.Date;//日期
Parameters.ParamByName('bm1').Value:=Node2.Text;//部门字段
Open;
while not Eof do
begin
TreeVIew1.Items.AddChild(Node3,FieldByName('xm').AsString);
Next;
end;
end;
不知道是不是我SQL语句的问题还是ADOQUERY的问题。
在执行的时候我使用事件探察器跟踪显示是这样的:先执行EXISTS里面的SELECT,然后再整个执行一下SQL语句,在执行EXISTS里的SELECT的时候参数传递正常,当执行到整个这个SQL语句的时候,参数就残缺不全了。
谁能告诉我这是为什么,我错在那里了,谢谢大家!
with Adoquery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:sj1)');
Parameters.ParamByName('sj1').Value:=DateTimePicker2.Date;//日期
Parameters.ParamByName('bm1').Value:=Node2.Text;//部门字段
Open;
while not Eof do
begin
TreeVIew1.Items.AddChild(Node3,FieldByName('xm').AsString);
Next;
end;
end;
不知道是不是我SQL语句的问题还是ADOQUERY的问题。
在执行的时候我使用事件探察器跟踪显示是这样的:先执行EXISTS里面的SELECT,然后再整个执行一下SQL语句,在执行EXISTS里的SELECT的时候参数传递正常,当执行到整个这个SQL语句的时候,参数就残缺不全了。
谁能告诉我这是为什么,我错在那里了,谢谢大家!
解决方案 »
- ???如何向指定目录DLL文件最后一行写入一个字符串???
- 当u盘插上后会触发什么事件
- 模拟Delphi IDE,实现8个黑方块,拖拉改变大小等功能
- 谁有bds2006 repack cd1里的shkbds1r.r01,谢谢,急啊
- MAX_PATH 的 问题
- 高分请教:如何才能用socket接收一个XML串,然后作一下处理,再发将这个XML串发出去?
- 数据显示和打印
- 怎样把TImage.Canvas中已画的图抹掉??谢谢!
- 上海地区精通VC++或DELPHI编程高手合作开发股票软件
- 在两个form中完全相同的两个控件(包括其事件和相关控件),可否共用一段代码?
- 如何取中表中最大数?
- 在DBGRID上输入了数字后数据库便自动保存数据了,怎样防止这种事情的发生???
改:
Parameters.ParamByName('sj1').Value:=formatdatetime('yyyy-mm-dd',DateTimePicker2.Date);//日期
Parameters.ParamByName('bm1').Value:= QuoteStr(Node2.Text);//部门字段
在SQLSERVER里能执行, 在DELPHI中就不行了,在DELPHI中 要加一个单引号,要用两个单引号。你在运行的时候打开之前加个showmesage(sql.text)看看,这个SQL语句是什么样子的,肯定不是完整的。这样Sql.Add('Select xm from jc_ryjcxx where bm=:'''+bm1+''''+' and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:'''+sj1+'''')');
不要用参数
肯定是先执行exist语句
因为先要判断条件啊,由内向外执行
小风你说详细一点呀,
你是说你直接写DateTimePicker2.Date 和 Node2.Text 就没错吗?
其他没错!我现在想知道的事情就是为什么在这样的SQL语句中为何传递参数会有问题。其实问题解决起来很简单,可能你也想到了,但这并不是我想要的答案!
begin
Close;
Sql.Clear;
Sql.Add('Select xm from jc_ryjcxx where bm=:bm1 and not exists (SELECT distinct kh, xm,zw rylb, left(jcsj,10) as rq FROM kz_jcrykz WHERE (rylb = ''内部'') AND bm=jc_ryjcxx.bm AND LEFT(jcsj, 10) =:sj1)');
Parameters.ParamByName('sj1').Value:=DateTimePicker2.Date;
//DateToStr(DateTimePicker2.Date);你改一下。
Parameters.ParamByName('bm1').Value:=Node2.Text;//部门字段
Open;
while not Eof do
begin
TreeVIew1.Items.AddChild(Node3,FieldByName('xm').AsString);
Next;
end;
end;
如果不可以的话,那么直接把参数代了进去,用一下SQL.SaveToFile('SQL.Txt');//之后放在查询分析器里边试一试。
再者,你怎么Distinct和那么多的字段一起用???
Parameters[1].Value:=Node2.Text;//部门字段or
Parameters[0].Value:=DateToStr(DateTimePicker2.Date);
Parameters[1].Value:=Node2.Text;//部门字段
——————————————————————————————
这句话是什么意思?小风哥?
但是我想知道为什么传参数的时候就不行呢?myling(阿德)就是说,他先执行子查询,然后再执行整个查询,明白吗?执行整个查询的时候参数就不完整了。
沉沦中..........
myling(阿德):无效!
特别感谢楼上各位的兄弟,结贴!
Provider=SQLOLEDB.1;Password=dprogram;Persist Security Info=True;User ID=sa;Initial Catalog=Northwind;Data Source=DPROGRAM;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DPROGRAM;Use Encryption for Data=False;Tag with column collation when possible=False with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('Select * From Employees where LastName <> ''Davolio'' and City <> :Value1 and Not ' +
'Exists(Select Distinct CustomerID , EmployeeID , Left(OrderDate,10) as rq From ' +
'Orders where CustomerID <> ''asdfasdf'' and EmployeeID <> 0 and Left(ShippedDate,10) <> :Value2)' );
Parameters[0].Value := '1696-12-23';
Parameters[1].Value := '1696-12-23';
Open;
end;测试成功
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('Select * From Employees where LastName <> ''Davolio'' and City <> :Value1 and ' +
'Exists(Select Distinct CustomerID , EmployeeID , Left(OrderDate,10) as rq From ' +
'Orders where CustomerID <> ''asdfasdf'' and EmployeeID <> 0 and Left(ShippedDate,10) <> :Value2)' );
Parameters[0].Value := '1696-12-23';
//Parameters[1].Value := '1696-12-23';
Parameters.ParamByName('Value2').Value := '1696-12-23';
Open;
end;
测试成功
比如说:取Null?----------------
沉沦中..........