【问题标题】:No database connectivity from within Windows ServiceWindows 服务中没有数据库连接
【发布时间】:2009-06-18 23:31:24
【问题描述】:

我正在尝试在 CBuilder 6(目标 XP Pro)中编写服务。该服务的部分工作是监视和更新数据库中的表。我们使用直接 ODBC 连接到数据库,但问题也发生在 ADO 上,所以为了简单起见,我们将使用它。

您可以在下面看到我的代码。这是从在 ServiceStart 事件中执行的函数调用的。

我的问题是,我无法建立连接。我们的 MSSQL DB 使用域身份验证,因此我尝试使用我的域帐户运行该服务。我也尝试过明确定义我的域\用户名和密码,但这也不起作用(在服务的属性中,登录选项卡)。

谁能帮我解决这个问题?任何事情都值得赞赏。

我的另一个问题是如何调试服务?我安装了远程调试器。我是否使用 rundll32.exe 之类的东西来生成进程?再次感谢任何帮助。

提前致谢

斯图。

代码片段:

TADOConnection* DB = new TADOConnection(this);
  try
  {
    DB->ConnectionString = "Provider=MSDASQL.1;Password=password;Persist Security Info=True;User ID=usernamej;Data Source=datasource";
    DB->Connected = true;

    returnValue = DB->Connected;
    ShowMessage("Connected");
  }
  catch (Exception &exception)
  {
    ShowMessage("Not COnnected");
  }

注意:connectionstring 属性仅供参考,用户名、密码和数据库已更改。在独立应用程序中使用此字符串可始终成功连接,并且可以使用查询获取数据。


回应 JP:

嗨,JP。

感谢您的评论。我实际上没有在这里抛出异常(这很奇怪)。我修改了代码(见下文)以包含更多的 msgbox,我看到的唯一一个是第一个 - 尝试连接。

ShowMessage("Attempting Login"); 
TADOConnection* DB = new TADOConnection(NULL); 
try { 
  ShowMessage("1"); 
  DB->ConnectionString = "<as before>"; 
  ShowMessage("2"); 
  DB->Connected = true; 
  ShowMessage("Connected"); 
} catch (Exception &exception) { 
  ShowMessage(exception.Message); 
  ShowMessage("Not COnnected"); 

} 

有什么想法吗?我不明白为什么连接组件甚至没有被创建(注意我尝试将所有者从这个更改为 NULL 以及只是为了看看会发生什么)。

谢谢!

斯图。

【问题讨论】:

  • 你能让你的异常块记录异常的细节吗?或者也许你有那个信息。已经可以发布了吗?这将有助于解决问题。
  • 嗨,JP。谢谢你的评论。我实际上没有在这里抛出异常(这很奇怪)。我修改了代码(见下文)以包含更多的 msgbox,我看到的唯一一个是第一个 - 尝试连接。 ShowMessage("正在尝试登录"); TADOConnection* DB = 新的 TADOConnection(NULL);尝试 { ShowMessage("1"); DB->ConnectionString = ""; ShowMessage("2"); DB->已连接=真; ShowMessage("已连接"); } catch (Exception &exception) { ShowMessage(exception.Message); ShowMessage("未连接"); } 有任何想法吗?谢谢!斯图。
  • (我会在我原来的问题中再次粘贴它,因为响应格式不是很好:/)
  • 我在其他地方发现了另一个线程,有人说他们在使用 Delphi 的服务中遇到 ADO 问题。我发现需要进行 CoInitialize 和 CoUninitialize 才能让它运行。我现在更接近了:) 现在抛出的错误是我的 PC 不受信任 - 这很酷。我想我需要更改服务所有者(登录身份)。
  • 只是为了回答您关于服务调试的问题 - 您可以像调试任何其他进程一样调试该进程。但是,如果您想调试它的启动,请按照以下说明操作:msdn.microsoft.com/en-us/library/a329t4ed(VS.71).aspx

标签: sql-server windows database service c++builder


【解决方案1】:

如果您使用域身份验证,则连接字符串中不应包含用户名或密码:

Server=myServerName\theInstanceName;Database=myDataBase;Trusted_Connection=True;

或者来自http://www.connectionstrings.com/sql-server-2005的适当变体

您的计算机需要成为域的成员,并且数据库服务器需要信任该域。该服务需要在计算机所属域下的帐户下运行。

【讨论】:

  • 嗨。感谢cmets。这是使用域身份验证,但我正在试验连接字符串,看看我现在是否必须指定用户处于服务级别。干杯!
【解决方案2】:

您遇到的是 Windows 服务权限问题。

  • 基本上,服务存在于较低权限的环境中。

  • 我建议您登录到事件日志。

  • 仅当您将其作为本地服务运行并启用交互式桌面时,才会显示生成的窗口。

【讨论】:

  • 感谢您的建议。我一直在研究如何使用事件日志,但到目前为止还没有真正写到它的运气。我现在只是在试验它。在本地拥有数据库为我解决了这个问题。无论如何,数据库总是会与服务一起使用(我当时并没有意识到这一点)。
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2013-07-30
相关资源
最近更新 更多