1

当尝试使用 SQL Server Compact Edition 替换 SQL Server 时,只修改连接字符串,我的应用程序无法成功访问 .sdf 数据库文件。

我想在以下领域获得更多信息:

  • 从 SQL Server 更改为 SQL Server Compact Edition 的过程是什么
  • 此过程需要用于使用 ADO 的旧 C++ 应用程序
  • 我是否需要从 ADO 更改为实例化 COM 对象(请告诉我不是这样)
  • SQL Server Compact Edition 2005 的 Provider= 值应该是多少

我做过的事情:

  • 我已经安装了 SQL Server Compact Edition 4.0,但我不确定是否有必要
  • 我尝试了各种连接字符串
  • 我目前正在使用 Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0 引发异常

我已经阅读了足够多的无用的 Microsoft 网页,因此请不要提供任何看似假设现代源代码库的简短神秘文章的链接。我已经花了足够的时间在 connectionstring.com 上仔细阅读连接字符串,所以请不要提供任何指向那里的链接。

我有一个旧的 C++ 和 C 应用程序,它有一个 DLL,它使用连接字符串访问 SQL Server 数据库,该连接字符串适用于 SQL Server 的多个版本(旧的 MSDE 以及新的 SQL Server Express 2012)。

ConnectionStringNoDB = L"Provider=MSDASQL;DRIVER={SQL Server};SERVER=lpc:(local);DATABASE=;UID=; Password=;";

我现在正在寻找用 SQL Server Compact Edition 替换 SQL Server。到目前为止,我能够确定的是我需要修改我的连接字符串以使用不同的提供者,比如这个。

ConnectionStringNoDB = L"Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=MyDatabase#1.sdf;";

但是,当我尝试使用上述连接字符串打开时,打开失败并抛出异常,hResult 为 E_FAIL,并且抛出的异常对象的错误文本是“未指定的错误”。使用 VS 2005 调试器,我捕捉到一个异常被抛出的错误对话框,上面写着“第一次机会异常 Microsoft C++ 异常:_com_error at memory location 0x00128f10”。

当我从“工具”菜单“连接到数据库...”菜单项中使用 VS 2005 工具时,我可以使用“.NET Framework Data Provider for SQL Server Compact”的数据提供者将数据源设置为“Microsoft SQL Server 2005 Compact Edition”版”。

open的实际源码如下

HRESULT hr = NULL;
CString  errorMessage;
_bstr_t userId = "", passWord = "";
try
{
    if (m_pConnection->State != adStateOpen)
    {
        m_pConnection->ConnectionString = ActiveConnection;
        m_pConnection->Open(ActiveConnection, userId, passWord, -1);
    }
    hr = m_pRecordSet->Open((VARIANT)Source, _variant_t((IDispatch *)m_pConnection),CursorType,LockType,Options);
}
catch( _com_error &e)
{
    _bstr_t bstrSource(e.Description());
    TCHAR *description;
    description = bstrSource;
    errorMessage.Format(_T("ERROR OpenRec %s  %s"), e.ErrorMessage(), description);
    hr = e.Error();
}           

m_pConnection 和 m_pRecordSet 对象是:

_RecordsetPtr       m_pRecordSet;   // recordset object
_ConnectionPtr      m_pConnection;

当我在 VS 2005 调试器中运行我的应用程序时,我可以在输出窗口中看到以下行,这表明正在访问和加载 SQL Server Compact Edition 4.0。

'Framework.exe': Loaded 'C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\sqlceer40EN.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\comsvcs.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\colbact.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\mtxclu.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\wsock32.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\clusapi.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\WINDOWS\system32\resutils.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\sqlceqp40.dll', No symbols loaded.
'Framework.exe': Loaded 'C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\sqlcese40.dll', No symbols loaded.
First-chance exception at 0x7c812fd3 in Framework.exe: Microsoft C++ exception: _com_error at memory location 0x00128f10..
c:\users\rchamber\genpos_workspaces\rel_221\nhpos\plutotal\cnadoxp.h(426): ERROR OpenRec Unspecified error  (null)

编辑 2013 年 8 月 28 日

我想知道的另一件事是是否真的找到了提供者。当我使用添加或删除程序删除 SQL Compact Edition 4.0,然后将连接字符串修改为“Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0”时,打开失败并显示错误消息“ERROR OpenRec Unknown error 0x800A0E7A Provider cannot be找到了。它可能没有正确安装。” 正如预期的那样。这向我表明连接字符串是有效的,因为它正在查找提供程序,但是还有其他一些错误。

我想知道是否可能存在对 .NET 的依赖,但是检查添加或删除程序我确实安装了 Microsoft .NET Framework 4 客户端。

当我将连接字符串更改为使用 SQL Compact Edition 3.5 时,我收到相同的未指定错误消息。检查添加或删除程序,我确实安装了 Microsoft .NET Framework 3.5 SP1 以及 Microsoft SQL Server Compact 3.5 SP1 English 安装。

4

0 回答 0