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

时间:2012-05-18 19:43:16

标签: delphi sql-server-ce

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

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

还要检查 this ,以帮助受保护的数据库

  

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