UDL的关联程序是OLE DB CORE SERVICE,所以双击会弹出DATA LINK PROPERTIES对话框,但如果你反点,选打开方式为NOTEPAD,则可以直接查看里面的内容!我在程序中使用TSTRINGLIST对象和TEXTFILE类型变量读取的UDL文件内容都是乱码,为什么,怎么解决?
我这样写地,unit Unit1;interfaceuses 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.
To HalfDream 你好,你的方法我看到和PromptDataSource很相似,谢谢,我已经验证可以了,谢谢! 具体内容我在研究研究,顺便你可以帮我解释一下你的代码的具体含义吗?
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;
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,
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;
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.
你好,你的方法我看到和PromptDataSource很相似,谢谢,我已经验证可以了,谢谢! 具体内容我在研究研究,顺便你可以帮我解释一下你的代码的具体含义吗?
通过它可以创建读写数据库连接的初始信息到指定的UDL文件。 DataInit:=CreateComObject(CLSID_DataLinks)as IDataInitialize;//创建接口。
DataInit.LoadStringFromStorage(fname,s);//从文件中取出数据到串S中。。
ShowMessage(s); //显示取出的连接串,
DataInit:=nil;//释放
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;
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,