2012-01-08 7 views
2

私はMS SQL Compact Server 3.5のdllとインクルードファイルを持っています。 OLE DBなしでどのように使用できますか?私はちょうどdllをロードし、必要なメソッドを自分自身を呼び出す、COMはしないでください。OLE DB APIを使用していないC++でMS SQL Compact Server 3.5データベースを照会するにはどうすればよいですか?

誰もがAPIを知っていますか? MSSQLコンパクトServerエディションを使用してデータベースにアクセスする実証++ Cで完全に機能する例が

EDIT

これが不可能な場合がありますか?

+0

「お楽しみ」。しかし、SqlServerの「ネイティブ」インターフェイスはODBCでした。 OTLを試してみてください:http://otl.sourceforge.net/ – CapelliC

答えて

0

私はそれが可能だとは思わない - http://msdn.microsoft.com/en-US/library/ms174579(v=SQL.90).aspx - OLEDBサンプルをここに提供されています:http://archive.msdn.microsoft.com/sqlce/Release/ProjectReleases.aspx?ReleaseId=3808

+0

ありがとう、私は自分の質問を編集しました.C++にSQL Compact Serverデータベースへのアクセスを実演する完全な機能のあるサンプルがありますか? – mark

+0

私の返信を更新しました! – ErikEJ

+0

もっと集中したサンプルをいただきたいと思います。私はモバイルエミュレーションパックをインストールしなくても、長い間失われたWin32 GUIプログラミングスキルを回復する必要はありません... – mark

2

私はちょうどあなたが何もCOMに言及していない気づきました。もしそうでなければ、私はADOを提案したでしょう。最近私はRaw C++ code to display the names of tables in an SQL compact server using OLE DBのOLEDBコードを掲載しました。

あなたが希望する(つまり、COMを伴う)C++の答えに私のADODBを見たい場合はそうでない場合、私はADODB VBScriptの例を変換して働いてきた:C++でADODBを使用するには

Dim con, rs 
Set con = CreateObject("ADODB.Connection") 
REM con.Provider = "Microsoft.SQLLITE.MOBILE.OLEDB.3.0" 
con.Provider = "Microsoft.SQLSERVER.CE.OLEDB.3.5" 
con.Open "InsertYourDatabase.sdf" 
Set rs = con.Execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES") 
While not rs.EOF 
    WScript.Echo rs.Fields.Item(0).Value 
    rs.MoveNext 
Wend 

はやや困難です、しかし、可能です。次のC++コンソールアプリケーションは、ADODBライブラリに#importをを使用してこれを行う方法を示しています。あなたはOLEVIEWを使用することにより、ADODBのIDLを抽出することができます

#include <stdio.h> 
#include <tchar.h> 
#include <windows.h> 
#include <oleauto.h> 
#include <atlbase.h> 
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HRESULT hr = S_OK; 

    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 

    // Open a SQL Server CE 3.5 database. 
    CComPtr<_Connection> spConnection; 
    hr = spConnection.CoCreateInstance(CLSID_Connection); 
    //hr = spConnection->put_Provider(CComBSTR(L"Microsoft.SQLLITE.MOBILE.OLEDB.3.0")); 
    hr = spConnection->put_Provider(CComBSTR(L"Microsoft.SQLSERVER.CE.OLEDB.3.5")); 
    hr = spConnection->Open(CComBSTR(L"InsertYourDatabase.sdf"), CComBSTR(L""), CComBSTR(L""), -1); 

    // Execute a query. 
    CComPtr<_Recordset> spRecordset; 
    CComVariant varRecordsAffected; 
    hr = spConnection->Execute(CComBSTR(L"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"), &varRecordsAffected, -1, &spRecordset); 

    // Fetch the results. 
    VARIANT_BOOL bEOF = VARIANT_TRUE; 
    hr = spRecordset->get_EOF(&bEOF); 
    while (SUCCEEDED(hr) && bEOF != VARIANT_TRUE) 
    { 
     // Fetch the TABLE_NAME. 
     CComPtr<Fields> spFields; 
     hr = spRecordset->get_Fields(&spFields); 
     CComPtr<Field> spField; 
     hr = spFields->get_Item(CComVariant((int) 0), &spField); 
     CComVariant varTableName; 
     hr = spField->get_Value(&varTableName); 

     // Display the record. 
     if (varTableName.vt == VT_BSTR) 
     { 
      wprintf(L"%s\n", V_BSTR(&varTableName)); 
     } 

     // Move to the next record. 
     hr = spRecordset->MoveNext(); 
     bEOF = VARIANT_TRUE; 
     hr = spRecordset->get_EOF(&bEOF); 
    } 

    // Release smart pointers. 
    spRecordset = NULL; 
    spConnection = NULL; 

    CoUninitialize(); 
    return 0; 
} 

(私のPC上でそれがCの下のVisual Studioにインストールされていました:\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ OleView.exe)。 Cに移動

  • [ファイル]> [ビュータイプライブラリ...
  • :あなたはOLEVIEWランニングをした後の\ Program Files \ Common Files \システム\ ADO \は
  • をMSADO15.DLLオープン
をクリックします

これは、C++での使用に役立つADODBライブラリの完全な構文を提供します。 Microsoft MSDNのADO API Referenceを参照することもできます。

+0

それはそうです、 http://stackoverflow.com/questions/8780656/raw-c-code-to-display-the-names-of-tables-in-an-sql-compact-server-using-ole-d/9107697#9107697私の質問です... – mark

+0

登録をしたくないのでCOMが欲しくない理由です。多分あなたは別の質問で私を助けることができます - http://stackoverflow.com/questions/9102471/using-sqlserver-ce-without-installation – mark

+0

私たちはCOMのコンシューマーではなく、COMのプロバイダーです。登録を行う必要はありません。 ADOは既にシステムにインストールされています。これは、すべてのWindows展開で使用できるようにする必要があります。 –

-1

問題の解決方法に興味のある方にお勧めします。

COM APIを使用するためにSqlCEをインストールする必要はありません。

はここで手順は次のとおりです。

  1. あなたは右のDLLを持っていることを確認してください。 SQLCE 3.0 DLLの

    は、次のとおり

    • sqlceca30.dll
    • sqlcecompact30.dll
    • sqlceer30xx.dll
    • sqlceme30.dll
    • sqlceoledb30。SQLCE 3.5用のDLL
    • sqlceqp30.dll
    • sqlcese30.dll

    • sqlceca35.dll
    • sqlcecompact35.dll
    • sqlceer35EN.dll
    • sqlceme35.dll
    • sqlceoledb35.dll
    • sqlceqp35.dll
    • sqlcese35.dll

    とSQLCE 4.0:

    • sqlceca40.dll
    • sqlcecompact40.dll
    • sqlceer40EN.dll
    • sqlceme40.dll
    • sqlceoledb40.dll
    • sqlceqp40.dll
    • sqlcese40.dll

    はまた、それぞれのCOMクラスの定義については、.hファイルが必要な場合があります。

    • sqlce_err.h
    • sqlce_oledb.hあなたはそれが属するバージョンを確認する必要が自衛隊のSQL CEデータベースファイルを考えると
    • sqlce_sync.h
  2. :私は、これらの持っています。 Googleの場合は、基本的にファイルの最初の16バイトを読んで、マジックナンバーを見つけてバージョンを判断する必要があります。

  3. Sql CEバージョンが分かっている場合は、それぞれのSql CE DLL(上記参照)を含むディレクトリを探します。
  4. NNが30,35、または40のsqlceoledbNN.dllの場合は、::LoadLibrary win32 APIを呼び出します。これは他のDLLに依存するため、近くになければなりません。
  5. ::GetProcAddress win32 APIを呼び出して、エクスポートされたDllGetClassObject関数のアドレスを取得します。
  6. DllGetClassObjectへのポインタが手元にあるので、Sql CEが提供するCOM APIを実行する準備が整いました。

は、私はWindowsを使用してより多くのではないので、私はテスト(ひいては投稿しない)はお答えできません

関連する問題