我有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运行:
这将给你一个ADODB库的完整语法,它将帮助你在C ++中使用它。 您也可以参考Microsoft MSDN的ADO API参考 。
对于那些对如何解决问题感兴趣的人。
一个不必安装SqlCE为了使用它的COM API。
这里是步骤:
确保你有正确的dll。
对于SqlCE 3.0的DLL是:
对于SqlCE 3.5:
和SqlCE 4.0:
您可能还需要.h文件来定义相应的COM类。 我有这些:
给定一个Sdf Sql CE数据库文件,你必须确定它属于哪个版本。 谷歌为它,基本上你需要读取该文件的前16个字节,找到幻数,它决定了版本。
::LoadLibrary
win32 API为sqlceoledbNN.dll,其中NN是30,35或40.它依赖于其他dll,因此它们必须靠近它。 ::GetProcAddress
win32 API来获取导出的DllGetClassObject
函数的地址。 DllGetClassObject
的指针,你就可以使用Sql CE提供的COM API了。 “请享用”