描述:
我简单的利用ATL做了一个EXE类型的COM服务器程序,其中封装了ADO的部分功能。
连接数据库的函数,关键部分如下:
STDMETHODIMP CMy_ADO::Open(BSTR Computer, BSTR dbName, BSTR dbUser, BSTR dbPsw)
{
HRESULT hr;
hr = m_connection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
_bstr_t strConn("Provider=SQLOLEDB.1;Password=begin_sa;"
"Persist Security Info=True;User ID=sa;"
"Initial Catalog=dbPos;Data Source=GUOXP");
hr = m_connection->Open(strBConn,L"",L"",
adConnectUnspecified);
{
if (SUCCEEDED(hr))
{
// ……处理代码
}
}
else
{
MessageBox(NULL,L"can't Connection to
DataBase...",L"Server Error!",MB_OK);
}
}
}
else
MessageBox(NULL,L"can't CreateInstance
(ADODB.Connection)",L"Server Error!",MB_OK);
return hr;
}
如果在本地计算机上测试该组件(数据库、COM组件应用程序都在本地),那么将能够正确的连接到数据库上;
如果从局域网内的另一台计算机上访问组件,那么组件实例能够创建成功,然而总会
报错:
"Can't Connection to DataBase..."
请诸位高手指点,是否这个连接字符串写的有问题呀??该如何改正这个问题呢?
解决方案1:
调用com的用户需是数据库服务器的一个合法用户!
解决方案2: 两种可能,支持
qiuxiangyong
icelight
hr = m_connection->Open(strBConn,L"",L"",adConnectUnspecified);
看看你的hr的返回值啊,应该能告诉你更详细的信息
icelight的说法也非常值得考虑
可可以指定你的COM组件运行权限看看
没理解错的话:你的COM与数据库一直在同一电脑上,而客户端就可以在同一电脑上也可以在不同电脑上。若在同一电脑上就连接数据库成功,而不在同一电脑上就连接数据库失败。这的确很奇怪,会不会跟权限有关?本机的客户端是以管理员身份运行的,而远程客户端就没这个身份。
解决方案5: 知道UDL文件吗?用它来测试一下字符串。
新建一TXT文件,改后缀为UDL。双击测试正确后,用NODEPAD打开,取字符串。