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は間違いなくフォルダにあります。また、データベースの作成時にどちらも指定する必要のないユーザー名やパスワードが必要であるという問題がありました。

質問:接続文字列に何か問題がありますか?SQL CompactデータベースにアクセスするためにADO接続を使用することは合理的ですか?一時ストレージからデータをクエリ/取得する簡単な方法があるでしょうか(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.

これは、SQLServerコンパクトファイルに接続するための基本的なサンプルです。

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

また、保護されたデータベースに役立つこれを確認してください

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

于 2013-11-29T18:24:04.790 に答える