通过ATL建立了一个简单的服务:
SC_HANDLE hService = ::CreateService(
        hSCM, m_szServiceName, m_szServiceName,
        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
        SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
        szFilePath, NULL, NULL, NULL, NULL, NULL);数据库连接代码是:
BOOL  ADOConn::OnInitADOConnBJ()
{
// 初始化OLE/COM库环境 
::CoInitialize(NULL);
_bstr_t strConnect;
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");

// 设置连接字符串,必须是BSTR型或者_bstr_t类型
strConnect = "Provider=SQLOLEDB.1;Data Source="+DB_RBServer \
+";Initial Catalog="+DB_RBDatabase+";User Id="+DB_RBUser+";Password="+DB_RBPwd+";"; //设置查询超时时间
m_pConnection->PutConnectionTimeout(10);
  m_pConnection->PutCommandTimeout(60);
m_pConnection->Open(strConnect,"","",adModeUnknown);

}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
bConnectStatus = FALSE;
_Module.WriteReport("ServiceInfo",CurDir+(LPCTSTR)e.Description()+(LPCTSTR)strConnect);
return FALSE;
}
bConnectStatus = TRUE;
return TRUE;
}
本机的数据库连接没任何问题,局域网内的SQl服务器怎么都连不上,是不是连接字符串或哪个参数不对呀?

解决方案 »

  1.   

    建立udl文件,试试能不能连接,可能是防火墙等原因udl文件内容如下例:[oledb]
    ; Everything after this line is an OLE DB initstring
    Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=192.168.0.11
      

  2.   

    服务的启动帐户是SYSTEM,跟你登录帐户是不一样的,如果app模式可用,那就完全是访问权限的问题了
      

  3.   

    ls说的不错,这两天查了资料才发现这问题,服务启动默认用户为localsystem,没有网络访问权限,如果更改启动用户,则无法与桌面程序进行交互,二者只能选其一所以干脆做成无窗口的隐藏进程算了