Linq2SQL正在使用控制台应用程序,但不能使用Windows服务

时间:2011-07-25 03:27:55

标签: c# sql-server linq linq-to-sql windows-services

很难选择正确的标题,但问题在于:

我有一个简单逻辑的应用程序,它从TFS获取数据,迭代“items”并使用这些“items”更新本地DB。以下是更新行的代码段:

using (ResultDBDataContext local_db= new ResultDBDataContext())
{
DBTestResult dbRes = local_db.DBTestResults.getByPrimaryKey(args_supplied);
if (dbRes == null) {
  dbRes = new DBTestResult(){//set properties}
  local_db.DBTestResults.InsertOnSubmit(dbRes);
}
else{
  dbRes.isDirty = true;
  dbRes.otherPropertis = set_to_some_values;
}
local_db.SubmitChanges();
}

这适用于Windows控制台程序(导入> 100K这样的行),这证明逻辑是正确的。但是当我将相同的逻辑放到Windows服务(针对相同的数据)时,一段时间后(< 2K行)我得到一个SQL异常,说“不能将重复的密钥插入表中”。请注意,在更新/插入每一行

后,我会执行SubmitChanges()

我认为这在某种程度上与以下有关,但无法找出原因:

  • Windows服务如何处理数据库连接。 (它们是否汇集?它们是否缓存数据等等。)
  • Linq2SQL Dataconext处理它的更新对象。 (Linq2SQL Datacontext的哪些属性使其在Windows服务下的行为有所不同?)

非常欢迎有关如何解决此问题或查找有关此问题的更多信息的任何想法/建议/链接/教程/文章。

感谢。

更新:来自TFS的数据可能违反了数据库的主键约束 - 但由于我一次插入/更新一行并提交更改,因此同一主数据库的最后一个条目key将驻留在数据库中。

2 个答案:

答案 0 :(得分:1)

  

非常欢迎有关如何解决此问题或查找有关此问题的更多信息的任何想法/建议/链接/教程/文章。

这听起来像是代码的服务端不是问题。

我认为您需要进一步记录/检查此错误行为 - 只需尝试记录正在发生的主键 - 可能是您在getByPrimaryKey实现中发现了一些错误。

同时检查您的服务是否是单线程的 - 即不能同时执行两个实例 - 这肯定会导致错误。

答案 1 :(得分:0)

什么是触发您的服务以启动它的操作?听起来你的进程第二次运行导致你的数据被处理两次而不是一次,当它作为控制台应用程序运行时。

例如,如果您使用FileSystemWatcher让您知道新文件何时到达处理,则观察程序将在创建文件时触发多个事件,并添加到(更新)。