2 votes

Connexion à un fichier SQL Compact (.sdf) à l'aide d'une connexion ADO dans Delphi

J'essaie d'utiliser un fichier .sdf local comme moyen de stockage temporaire si la base de données principale est inaccessible. J'ai le fichier .sdf, mais lorsque j'essaie de le définir sur le fichier, il semble ne pas savoir du tout si le .sdf existe. La chaîne de connexion que j'ai actuellement est :

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

et pour le fournisseur qu'il a généré pour moi :

 Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5

Lorsque j'essaie d'utiliser la connexion, j'obtiens un message "Provider cannot be found. Il se peut qu'il ne soit pas correctement installé". Le fichier .sdf se trouve bien dans le dossier. J'ai également eu ou j'ai un problème avec le fait qu'il voulait un nom d'utilisateur et/ou un mot de passe, que je n'ai pas eu à spécifier lors de la création de la base de données.

La question : Y a-t-il un problème avec ma chaîne de connexion ? Est-il raisonnable d'utiliser des connexions ADO pour accéder à des bases de données SQL Compact ? Existe-t-il un moyen plus simple d'interroger/récupérer des données à partir d'un stockage temporaire (je préférerais cependant le faire avec SQL) ? La plupart des documents semblent dater de 2003/2005, ce qui n'est pas très utile.

J'ai utilisé "connectionstrings.com" pour m'aider à créer la chaîne. Tout conseil serait utile, merci

5voto

RRUZ Points 98685

Tout d'abord pour ouvrir le fichier sdf vous devez utiliser un fournisseur compatible avec la version du fichier sdf. Comme vous mentionnez dans vos commentaires la version 3.5 vous devez utiliser ce fournisseur Microsoft.SQLSERVER.CE.OLEDB.3.5

Ensuite, vous devez vous assurer que le fournisseur est installé

Essayez ce code pour lister les fournisseurs OLEDB installés sur votre système.

{$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.

Ceci est un exemple de base pour se connecter à un fichier compact 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.

0voto

GoAntonio Points 155

Vérifiez également ce ce qui permet de protéger les bases de données

"Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0 ; données source= \NorthWind.sdf ; SSCE:Database Password="

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X