我如何在C ++中查询不使用OLE DB API的MS SQL Compact Server 3.5数据库?

我有MS SQL Compact Server 3.5的dll和包含文件。 如何在没有OLE DB的情况下使用它? 我只是想加载DLL并调用必要的方法,请不要COM。

有谁知道API?

编辑

如果这是不可能的,那么在C ++中是否有一个function完整的示例,演示如何使用MSSQL Compact Server版本访问数据库?

我不认为这是可能的 – http://msdn.microsoft.com/en-US/library/ms174579(v=SQL.90).aspx – 一个OLEDB示例可在这里: http://archive.msdn。 microsoft.com/sqlce/Release/ProjectReleases.aspx?ReleaseId=3808

我只注意到你提到没有COM。 如果不是,我会建议ADO。 最近,我发布了一些用于Raw C ++代码的 OLEDB代码,以便在使用OLE DB的SQL压缩服务器中显示表的名称 ,您可能会发现它们很有用。

否则,如果你希望看到我的ADODB在C + +答案(涉及COM),我已经通过转换一个ADODB VBScript的例子:

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有点艰巨,但是,这是可能的。 以下C ++控制台应用程序显示了如何通过在ADODB库上使用#import来完成此操作:

 #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; } 

您可以使用OleView(在我的电脑上安装了Visual Studio下的C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ OleView.exe)来提取ADODB的IDL。 一旦你有OleView运行:

  • 文件>查看TypeLib …
  • 导航到C:\ Program Files \ Common Files \ System \ ADO \ msado15.dll
  • 点击打开

这将给你一个ADODB库的完整语法,它将帮助你在C ++中使用它。 您也可以参考Microsoft MSDN的ADO API参考 。

对于那些对如何解决问题感兴趣的人。

一个不必安装SqlCE为了使用它的COM API。

这里是步骤:

  1. 确保你有正确的dll。

    对于SqlCE 3.0的DLL是:

    • sqlceca30.dll
    • sqlcecompact30.dll
    • sqlceer30xx.dll
    • sqlceme30.dll
    • sqlceoledb30.dll
    • sqlceqp30.dll
    • sqlcese30.dll

    对于SqlCE 3.5:

    • 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

    您可能还需要.h文件来定义相应的COM类。 我有这些:

    • sqlce_err.h
    • sqlce_oledb.h
    • sqlce_sync.h
  2. 给定一个Sdf Sql CE数据库文件,你必须确定它属于哪个版本。 谷歌为它,基本上你需要读取该文件的前16个字节,找到幻数,它决定了版本。

  3. 知道Sql CE版本,找到包含相应Sql CE dll的目录(参见上文)。
  4. Call ::LoadLibrary win32 API为sqlceoledbNN.dll,其中NN是30,35或40.它依赖于其他dll,因此它们必须靠近它。
  5. 调用::GetProcAddress win32 API来获取导出的DllGetClassObject函数的地址。
  6. 手边有指向DllGetClassObject的指针,你就可以使用Sql CE提供的COM API了。

“请享用”