问题困扰了我很长时间,FW们请看看...(300分,D6的ADO/MIDAS问题,不够可以再加)(300分)

  • 主题发起人 主题发起人 djdsz
  • 开始时间 开始时间
D

djdsz

Unregistered / Unconfirmed
GUEST, unregistred user!
在SQLServer 2000数据库ERKD中定义如下一张表:
create table D6ADOMIDAS
(
A varchar(20) not null primary key,
B datetime
)
用D6新建一个工程,放入一个TADOConnection,TADOQuery,TDataSetProvider,
TClientDataSet,TDataSource,TDBGrid设置ADOConnection连接到SQL2000的ERDK数据库,
其他默认。
AdoQuery
connection=AdoConnection,
SQL='select * from D6ADOMIDAS where a=:ppp1 and b=:ppp2',paramcheck=true
DataProvider
DataSet=AdoQuery
Clientdataset
ProviderName=DataProvider.Name
并且FetchParams
DataSource
DataSet=ClientDataSet1
DBGrid
DataSource=DataSource1
放入一个按钮,写如下的onClick事件
ClientDataSet1.params[0].asstring:='';
ClientDataSet1.params[1].asstring:='2000-01-01';
ClientDataSet1.open;
运行程序并按按钮,错误出现了:
不能比较或排序text,ntext和image数据类型,除非使用is null或like运算符。
调试程序,在ADODB中出错,但测试ADOQuery的参数,没有错误的
AdoQuery1.parameters.items[0].value=''
AdoQuery1.parameters.items[1].asstring='2000-01-01'
当执行过Button.OnClick后,再执行如下的语句:
Adoquery1.Close;
Adoquery1.Parameters.Items[0].Value:='';
Adoquery1.Parameters.Items[1].Value:='1999-01-01';
Adoquery1.Open;
也会有相同的错误,该错误应该是没有对参数0重新赋值引起的。
当将Button.OnClick写成如下:
ClientDataSet1.params[0].asstring:=' ';//以前是''
ClientDataSet1.params[1].asstring:='2000-01-01';
ClientDataSet1.open;
错误不再出现。
问题:D6在MIDAS应用中与M$ SQLServer2000(通过ADO)连接,使用ClientDataSet.params[n].value
=''对一个ftString类型参数如何传递一个空字符串(不用DataRequest)
 
''是空而' '却是有字符的,该字符就是空格啊。你的第一个参数定义的是主键,不允许
空值,所以运行时会报错。
 
to:风中流云
不是主健一样的报错(不是主健、也没有对字段索引,也可以NULL),我写上面的表是因为力求简单罢了。
 
参数app1的数据类型如果是char,vchar一类的,
可以吧=写成like 试试。
还不行就把参数传‘0’。
 
[:(]你怎么這么沒有上大富翁了﹐我一般在中午上網啊﹗等了你好几天了。都沒見你。
[:(]
 
我也一样有着问题!!!!
 
这是传值出错
如果你传‘’的话
SQL语句就变为:
select * from D6ADOMIDAS where a= and b=‘20001-01-01’paramcheck=true
这样就发报错
如果你传空格的话
select * from D6ADOMIDAS where a=‘’ and b=‘20001-01-01’paramcheck=true
系统自动加上‘’,SQLSERVER就不报错了,
解决方案:
1,改变传值方式,如传空格。,
2,改SQL写法,
如:sql='select * from D6ADOMIDAS where a="'+变量名+'" and b=‘20001-01-01’paramcheck=true

 
我建议最好用format函数,delphi的parameters很不好用。
你可以
var s := 'select * from D6ADOMIDAS where a= ''%s'' and b=''%s''paramcheck=true'
然后用Sql := format(s,['','20001-01-01']);
 
谢谢各位。D5下是不会错的,直接对ADOQuery的参数赋值''也不会错。
至于改变SQL写法,我不可能这样考虑,因为我在客户端做关联,如果从表的参数在主表中
的对应字段为'',从表就报错。
我现在的解决办法是,写服务器端的ADOQuery的BeforeOpen事件,测试其参数值。总觉得,
这是D6的一个BUG。
to ZML:我今天中午回家去了,不在办公室。这几天很忙,明天还到中山去面视。
 
parambyname().value := ...
试试?
:)
另外,我想要TurboPower_April_2001
能帮我么?
ispmaster@cnuninet.com
 
还有一点,D6中用对TClientDataSet的Params直接赋值的方法无法传递中文。
 
这是一个Com的问题,空字符串会被认为是Null,据说整数0也一样(未试过),我的
解决办法是在客户端生成CommandText,当发现如上问题时对查询调价作修正。
 
我现在的解决是首先将参数传到服务器(服务器中过程)然后在客户端清掉所有参数,再OPen
 
现在我的解决方法是直接将参数传到服务器,好了。
没人给我很好的建议,所以,大家都得分!
 
后退
顶部