奇怪的查询结果(50分)

  • 主题发起人 主题发起人 fsmchinese
  • 开始时间 开始时间
F

fsmchinese

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的存储过程

Create proc Test
@Company varchar(50)
as
Declare @SQL varchar(1000)

Set @SQL = 'Select * from Service where (Company like '''+@Company+''')'

Exec(@SQL)

我在SQL Server Query Analyzer中用 Test '广州%' 可以查到所需结果,但在Delphi中
我用ADO做中介服务器,在客户端用下面的语句
ClientDataSet1.Close;
ClientDataSet1.Params.ParamByName('@Company').Value := Edit1.Text;
ClientDataSet1.Open;
却什么也查不到!!!
注: Edit1.Text =“广州%” (没有引号)




 
我觉得这样写好象不对,把SQL语句写全试试。
 
“把SQL语句写全”?
那为什么在SQL Server Query Analyzer中又能查到呢?
 
fsmchinese:
这是两个不同的概念,你用vb开发word的ole控制
程序的话各种方法.过程你都是可以用的

但是你在delphi中,你就没有这么幸运了.

这就是因为不同的程序环境,解释程序的
方法不同,你就不能太死心眼了.
:)

 
To thtfsyh
难道就在Delphi中就不能查了吗?!!!!

 
同样的存储过程我用ODBC就能查到,难道是ADO的BUG???
 
我举ole的例子,还有一层意思
你在delphi和vb中用同一个函数/过程的名称
和差数都是不一样的。
 
我观察过了,在中介服务器中传过来的参数是正确的,但传到SQL Server中之后就变了
好象 '广州%'成了'广'。奇怪的是我输入'广州% '它便成了'广州%'也就是说,有多少
个汉字就得加多少个空格!!!
奇怪!


thtfsyh 你到底在说些什么呀!简直是问非所答!!!

 
设置一下语言。
 
中介服务器如果用bde设置此bde连接的语言
 
是设置SQL的语言吗
 
在哪里设置语言呀?
 
从你给出的意思看来,你用的是MS SQL SERVER吧?!!

千万别错怪DELPHI。
要理解这个原因得先理解DELPHI和数据库的存储编码方式 。在BORLAND设计中,其编
码用的是ANSI STRING方式,而大多数的数据库厂商都采用的是UNICODE编码方式,这也是
为适应INTERNET发展的需要。而ADO是MS 发展出来的,DELPHI在调用ADO时,只是对其进行
简单的包装,内核还是用MS的那一套,所以在使用ADO时就存在着数据转换问题,尤其是对
非ASCII字符来说。
所以要解决你的问题,可以在应用程序服务器的DataSetProvider的Before事件中进行如下
处理
我这里是用
procedure TAppLoginServer_new.DSPQueryBeforeExecute(Sender: TObject;
var OwnerData: OleVariant);
begin
with ADOQuery do begin
Parameters.ParamByName('@t3').Size := Length(Parameters.ParamByName('@t3').value)+1;
end;
end;
经过这样处理后,就不会有问题了。
 
你把 '广州%' =》 '广州*' 试试看
 
zengr的办法是可以的了,但这样挺麻烦的,修改工作量很大!!!
请问还有更简单的方法吗?
 
如果不想用存储过程,就该用动态的SQL语句来完成,也是可以的。
如果用存储过程,则必须改动了。因为前段时间,我做项目时,这个问题已将我搞得焦头
烂额的。
嘿嘿
 
那看来要等ADO的第二个补丁出来才能很好的解决了。
 
目前为止,也只有那么改了。其实这并非DELPHI的错。我觉得,如果BORLAND也采用UNICODE
编码的话,可能要一段时间的。我还是那句话:如果不用存储过程,用ADOQuery来完成吧
 
接受答案了.
 
我也遇到过此问题。我后来是用ADOQuery.
zengr:说是Delphi的Ansi String 和Unicode String的问题,我觉得并非如此。
我直接用ADOStoredProc执行存储过程来存储数据不会出现一半的情况(双层),
可见这应该不是Delphi的Ansi String 和Unicode String的问题,
而在三层中会出现一半的情况,我想可能还是Delphi的Midas有问题。
 
后退
顶部