OLE 参数传递问题 ( 积分: 200 )

  • 主题发起人 主题发起人 xeen
  • 开始时间 开始时间
X

xeen

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么参数传递不正确,请看下列代码:
var
v:OleVariant;
str:OleVariant;
begin

str := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False';
v := CreateOleObject('ADOX.Catalog');

v.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False'; [blue]//执行正确[/blue]
v.ActiveConnection := str; [red]//运行期错误! [/red]
end;

看起来两种方法没区别啊,到底原因何在哪?
 
为什么参数传递不正确,请看下列代码:
var
v:OleVariant;
str:OleVariant;
begin

str := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False';
v := CreateOleObject('ADOX.Catalog');

v.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False'; [blue]//执行正确[/blue]
v.ActiveConnection := str; [red]//运行期错误! [/red]
end;

看起来两种方法没区别啊,到底原因何在哪?
 
str:OleVariant;改成str:string;就可以
v.ActiveConnection用OleVariant赋值是不行的,用string才可以
而用string能赋值给OleVariant,因为OleVariant本身就是赋值对象类型不确定而声明的变量
 
你实验过吗?
我用 string类型 一样不行。
 
WideString呢
 
WideString 一样不行,有人实验吗?
 
用shortstring类型。
 
用 shortstring 我这里倒是不出错了。
不过 shortstring 最多255个字节也不够用啊,有人知道这种现象的原因吗,
我在 VC里没遇到这种问题。
 
这不是什么现象,这是2种类型的数据结构不同。
你深入的了解了它们之间的区别以及C字符串的结构就会发现是什么原因了。
最明显点的区别就是一个结束符。

如果你要用string的话需要改成如下:
var
v:OleVariant;
str:OleVariant;
begin

str := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False';
v := CreateOleObject('ADOX.Catalog');
v.ActiveConnection := str+''; //后面多加一个结束字符(即ascii 0)
end;

 
谢谢冰封,看来是这个原因,不过我奇怪 Delphi的编译器怎么不把这个
工作自己作上。
ADO 的 Conneciton对象就没这问题
var
v,conn:OleVariant;
str:widestring;
begin

str := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False';
conn := CreateOleObject('ADODB.Connection');
conn.ConnectionString := str; //运行正常

v := CreateOleObject('ADOX.Catalog');
v.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/2002.mdb;Persist Security Info=False'; //执行正确
v.ActiveConnection := str ; //运行期错误!
end;
 
看来这个疑问先留着吧,反正问题解决了。
 
多人接受答案了。
 
这个涉及到ADOX.Catalog的内部程序,从代码可以推断出给ActiveConnection赋值后,还有同时执行其他程序。另外呢,因为ActiveConnection本身可以是conn或者str,所以大概可以推断其工作原理是需要结束符的。因为ActiveConnection并不是字符串的类型。
 
后退
顶部