2012-05-18 69 views
2

我試圖使用本地.sdf文件作爲主數據庫無法訪問的臨時存儲方式。我有.sdf文件,但是當我嘗試將其設置爲文件時,似乎完全不知道.sdf是否存在。當前連接字符串我目前是:在Delphi中使用ADO連接連接到SQL壓縮文件(.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」來幫助製作字符串。任何建議將有所幫助,謝謝

+0

錯誤描述非常明確,您必須先安裝Oledb提供程序才能使用它,這是提供程序http://www.microsoft.com/en-us/download/details的下載鏈接。 ASPX?ID = 58 21 – RRUZ

+0

檢查它,「已安裝更高版本」。我確實有一個強烈的傾向,認爲這是司機和/或供應商的問題。 – Hoot

+0

「多步OLE DB操作產生錯誤,檢查每個DB狀態值(如果可用),沒有工作完成。」 – Hoot

回答

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. 
+0

確實安裝了它,但是對於它爲提供者設置的提供程序「Provider = Microsoft.SQLSERVER.CE.OLEDB.3.5」,它不是提供程序「Microsoft.SQLSERVER.CE.OLEDB」。 3.5「是。當我使用類似於 「AdoQuery.ConnectionString:='Provider = Microsoft.SQLSERVER.CE.OLEDB.3.5; Data Source = C:\ Datos \ Northwind.sdf';」 它把正確的提供者,並沒有在那個時候喊我。謝謝您的幫助。 – Hoot

0

還要檢查this至極有助於保護數據庫

「供應商= Microsoft.SQLSERVER.OLEDB.CE.2.0;數據 源= \ NorthWind.sdf; SSCE:數據庫密碼= 「