gpt4 book ai didi

delphi - 在 Delphi 中使用 ADO 连接连接到 SQL Compact 文件 (.sdf)

转载 作者:行者123 更新时间:2023-12-02 13:57:54 30 4
gpt4 key购买 nike

如果主数据库无法访问,我正在尝试使用本地 .sdf 文件作为临时存储手段。我有 .sdf 文件,但是当我尝试将其设置为文件时,似乎根本不知道 .sdf 是否存在。我当前拥有的当前连接字符串是:

 Driver={SQL Native Client};Data Source=C::\users\username\desktop\file\MyData.sdf;Persist Security Info=False

对于它为我生成的提供者:

 Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5

当我尝试使用该连接时,收到“找不到提供程序。它可能未正确安装。” .sdf 肯定在该文件夹中。我也有一个问题,它需要用户名和/或密码,而在创建数据库时我不必指定这两个用户名和/或密码。

问题:我的连接字符串有问题吗?使用ADO连接访问SQL Compact数据库是否合理?是否有一种更简单的方法来从临时存储中查询/检索数据(不过我更喜欢使用 SQL 来实现)?大多数文档似乎来自 2003/2005 年,这没有帮助。

我使用“connectionstrings.com”来帮助制作字符串。任何建议都会有帮助,谢谢

最佳答案

首先要打开 sdf 文件,您必须使用与 sdf 文件版本兼容的提供程序。由于您在评论中提到了版本 3.5,因此您必须使用此提供程序 Microsoft.SQLSERVER.CE.OLEDB.3.5

那么您必须确保安装了哪个提供程序

尝试使用此代码列出系统中安装的 OLEDB 提供程序

{$APPTYPE CONSOLE}

{$R *.res}

uses
Windows,
Registry,
Classes,
SysUtils;

procedure ListOLEDBProviders;
var
LRegistry: TRegistry;
LIndex: Integer;
SubKeys,Values: TStrings;
CurKey, CurSubKey: string;
begin
LRegistry := TRegistry.Create;
try
LRegistry.RootKey := HKEY_CLASSES_ROOT;
if LRegistry.OpenKeyReadOnly('CLSID') then
begin
SubKeys := TStringList.Create;
try
LRegistry.GetKeyNames(SubKeys);
LRegistry.CloseKey;
for LIndex := 0 to SubKeys.Count - 1 do
begin
CurKey := 'CLSID\' + SubKeys[LIndex];
if LRegistry.KeyExists(CurKey) then
begin
if LRegistry.OpenKeyReadOnly(CurKey) then
begin
Values:=TStringList.Create;
try
LRegistry.GetValueNames(Values);
LRegistry.CloseKey;
for CurSubKey in Values do
if SameText(CurSubKey, 'OLEDB_SERVICES') then
if LRegistry.OpenKeyReadOnly(CurKey+'\ProgID') then
begin
Writeln(LRegistry.ReadString(''));
LRegistry.CloseKey;
if LRegistry.OpenKeyReadOnly(CurKey+'\OLE DB Provider') then
begin
Writeln(' '+LRegistry.ReadString(''));
LRegistry.CloseKey;
end;
end;
finally
Values.Free;
end;
end;
end;
end;
finally
SubKeys.Free;
end;
LRegistry.CloseKey;
end;
finally
LRegistry.Free;
end;
end;


begin
try
ListOLEDBProviders;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.

现在这是连接到 Sql Server 紧凑文件的基本示例。

{$APPTYPE CONSOLE}

{$R *.res}

uses
ActiveX,
ComObj,
AdoDb,
SysUtils;

procedure Test;
Var
AdoQuery : TADOQuery;
begin
AdoQuery:=TADOQuery.Create(nil);
try
AdoQuery.ConnectionString:='Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\Datos\Northwind.sdf';
AdoQuery.SQL.Text:='Select * from Customers';
AdoQuery.Open;
While not AdoQuery.eof do
begin
Writeln(Format('%s %s',[AdoQuery.FieldByName('Customer ID').AsString,AdoQuery.FieldByName('Company Name').AsString]));
AdoQuery.Next;
end;
finally
AdoQuery.Free;
end;
end;

begin
try
CoInitialize(nil);
try
Test;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.

关于delphi - 在 Delphi 中使用 ADO 连接连接到 SQL Compact 文件 (.sdf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10658799/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com