如何读UDL文件的内容!

DDeveloper 2003-03-25 05:32:36
UDL的关联程序是OLE DB CORE SERVICE,所以双击会弹出DATA LINK PROPERTIES对话框,但如果你反点,选打开方式为NOTEPAD,则可以直接查看里面的内容!

我在程序中使用TSTRINGLIST对象和TEXTFILE类型变量读取的UDL文件内容都是乱码,为什么,怎么解决?
...全文
249 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2003-03-26
  • 打赏
  • 举报
回复
procedure SetConnectionStr;
var
DataInit:IDataInitialize;
FName,ConnectionStr:POleStr;
Reg:TRegistry;
tmp:widestring;
begin
............
tmp:=ReadString('InstDir')+'\MAS_DB_INI.UDL';
FName:=POleStr(tmp);


//因为POLESTR实际上是PWideChar指针。
//不能强制指向STRING类型,要先把STRING转为WIDESTRING,



DDeveloper 2003-03-26
  • 打赏
  • 举报
回复
procedure SetConnectionStr;
var
DataInit:IDataInitialize;
FName,ConnectionStr:POleStr;
Reg:TRegistry;
begin
Reg:=TRegistry.Create ;
with Reg do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey('SOFTWARE\HD\MAS',False);
FName:=POleStr(ReadString('InstDir')+'\MAS_DB_INI.UDL');
//★上面这个如果我写成FName:=ReadString('InstDir')+'\MAS_DB_INI.UDL'则报告一
//个编译错误,但如果我按照上面的方法写,则最后写到注册表中的串是个空的,说明
//根本没有找到我指定读取串的文件!怎么解决?
DataInit:=CreateComObject(CLSID_DataLinks) as IDataInitialize;
DataInit.LoadStringFromStorage(FName,ConnectionStr);
WriteString('ConnectionStr',ConnectionStr);
CloseKey;
Free;
DataInit:=Nil;
end;
end;
halfdream 2003-03-25
  • 打赏
  • 举报
回复
IDataInitialize它只是OLEDB提供的一个接口,
通过它可以创建读写数据库连接的初始信息到指定的UDL文件。

DataInit:=CreateComObject(CLSID_DataLinks)as IDataInitialize;//创建接口。
DataInit.LoadStringFromStorage(fname,s);//从文件中取出数据到串S中。。
ShowMessage(s); //显示取出的连接串,
DataInit:=nil;//释放
DDeveloper 2003-03-25
  • 打赏
  • 举报
回复
To HalfDream
你好,你的方法我看到和PromptDataSource很相似,谢谢,我已经验证可以了,谢谢!

具体内容我在研究研究,顺便你可以帮我解释一下你的代码的具体含义吗?
xzgyb 2003-03-25
  • 打赏
  • 举报
回复
我这样写地,

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyStringList = class(TStringList)
protected
procedure SetTextStr(const Value: string); override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s: TStringList;
begin
s := TMyStringList.Create;
s.LoadFromFile('E:\DBDEMOS.udl');
Memo1.Lines.Assign(s);
s.Free;
end;

{ TMyStringList }

procedure TMyStringList.SetTextStr(const Value: string);
var
P: PChar;
PEnd: PChar;
S: string;
begin
BeginUpdate;
try
Clear;
P := Pointer(Value);
PEnd := Pointer(PChar(Value) + Length(Value));
if P <> nil then
while P <= PEnd do
begin
S := '';
while not (P^ in [#10, #13]) and (P <= PEnd) do
begin
if (P^ <> #0) and (P^ > #0) and (P^ <= #127) then
S := S + P^;
Inc(P);
end;
if S <> '' then Add(S);
if P^ = #13 then Inc(P);
if P^ = #10 then Inc(P);
end;
finally
EndUpdate;
end;
end;

end.
halfdream 2003-03-25
  • 打赏
  • 举报
回复

uses oledb,comobj,activex;
{$R *.dfm}
\\可以类似下面这样来读写。

procedure TForm1.Button1Click(Sender: TObject);
var
DataInit:IDataInitialize;
fname:POleStr;
s:POleStr;
begin
fname:='d:\test.udl';
// s:='xxxx';

DataInit:=CreateComObject(CLSID_DataLinks)as IDataInitialize;
// DataInit.WriteStringToStorage(fname,s,CREATE_NEW);
DataInit.LoadStringFromStorage(fname,s);
ShowMessage(s);
DataInit:=nil;

end;
czzw 2003-03-25
  • 打赏
  • 举报
回复
用记事本打开就可以看到内容.当然具有特定的书写格式
czzw 2003-03-25
  • 打赏
  • 举报
回复
其实UDL就是一个文本文件

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧