2

如果主数据库无法访问,我正在尝试使用本地 .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”来帮助制作字符串。任何建议都会有所帮助,谢谢

4

2 回答 2

5

首先要打开 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.
于 2012-05-19T03:38:39.770 回答
0

还检查有助于受保护的数据库

“提供者=Microsoft.SQLSERVER.OLEDB.CE.2.0;数据源=\NorthWind.sdf;SSCE:数据库密码=”

于 2013-11-29T18:24:04.790 回答