我正在一个InvalidOperationException尝试添加使用LinqToSql行时。我们不能在内部复制它,并且仅对我们的一个客户发生大约0.06%的情况,总是对数据库进行相对简单的更改。(单行插入或单字段更新)
Message:
This SqlTransaction has completed; it is no longer usable.
Stack Trace:
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Rollback()
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
Run Code Online (Sandbox Code Playgroud)
这是一段示例代码(数据库自动生成主键)
TableName row = new TableName();
row.Description = "something";
row.Action = "action";
Context.TableName.InsertOnSubmit(row);
Context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
我们使用SQL Server 2008 R2。插入和更新确实在服务器上进行。但是我们仍然得到例外。没有什么可以阻止这些更新和插入的。没有依赖关系或其他东西。
我们如何阻止这些异常/僵尸检查/回滚的发生,或者是首先导致这些异常的原因?
编辑:
经过进一步检查后,实际上正在发生由SubmitChanges()完成的数据库更新。事务成功完成后,将调用此异常,并且数据库行将更新为新值。
我们有一个使用Linq-To-Sql的程序,并在我们的表上做了很多类似的查询.特别是,我们有一个timestamp列,我们提取最新的时间戳,以查看自上次查询以来表是否已更改.
System.Data.Linq.Binary ts;
ts = context.Documents
.Select(r => r.m_Timestamp)
.OrderByDescending(r => r)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
我们经常在与当前表单/查询无关的不同表上重复此查询.我想要做的是创建一个"函数"或可以重复此查询的最后3行的东西(理想情况下可以在每个表上工作).这是我想写的:
System.Data.Linq.Binary ts;
ts = context.Documents
.GetMostRecentTimestamp();
Run Code Online (Sandbox Code Playgroud)
但我不知道如何创建这个"GetMostRecentTimestamp".而且,这些查询从未如此简单.它们通常由客户或当前订单过滤,因此可能会有更有效的查询
ts = context.Documents
.Where(r => r.CustomerID == ThisCustomerID)
.GetMostRecentTiemstamp();
Run Code Online (Sandbox Code Playgroud)
有帮助吗?谢谢!
我选择了Bala R的答案,这里是更新的代码所以它编译:
public static System.Data.Linq.Binary GetMostRecentTimestamp(this IQueryable<Data.Document> docs)
{
return docs
.Select(r => r.m_Timestamp)
.OrderByDescending(r => r)
.FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案的唯一缺点是我必须为每个表编写这个函数.我会喜欢Tejs的答案,如果它真的有效,但我不会为它重新设计我的数据库.加上DateTime不是一个做时间戳的好方法.
虽然我可以执行诸如Documents.Where(...).GetMostRecentTimestamp()之类的查询,但如果我尝试执行基于关联的查询(例如MyCustomer.Orders.GetMostRecentTimestamp()或MyCustomer.Orders.AsQueryable),此解决方案将失败( ).GetMostRecentTimestamp();
我在旧式命令外壳中有一个名为GOPATH的环境变量集,我可以这样运行命令%GOPATH%\bin\hello: 
Windows PowerShell 10中是否有等效的简单命令?
编辑:我不尝试打印环境变量。我正在尝试使用它。
变量设置正确:
C:\WINDOWS\system32> echo $env:gopath
C:\per\go
Run Code Online (Sandbox Code Playgroud)
现在,我想在命令行调用中实际使用它,但是失败了:
C:\WINDOWS\system32> $env:gopath\bin\hello
At line:1 char:12
+ $env:gopath\bin\hello
+ ~~~~~~~~~~
Unexpected token '\bin\hello' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Run Code Online (Sandbox Code Playgroud)