0

我有一些代码将数据插入到一些表中(一个表有一个 FILESTREAM 列),然后在完成后调用 SubmitChanges。

db.Log = new System.IO.StreamWriter(@"c:\windows\temp\linq.log") { AutoFlush = true };
db.SubmitChanges(ConflictMode.FailOnFirstConflict);

我已经引用了以下链接,但它们似乎不是我的问题:

LINQ to SQL:SubmitChanges() 不起作用?

LINQ 未更新 .SubmitChanges()

每个表都有一个主键。 替代文字

我有 14 个表,我看到 linq.designer.cs 中包含 14 个 IsPrimaryKey=true

虽然我确实看到文件表中缺少“AutoSync=AutoSync.OnInsert”,但我认为这是因为未设置 IDENTITY(使用 guid 作为主键)。

当我检查数据库时,没有插入任何内容。linq.log 显示:

INSERT INTO [dbo].[Files]([fileID], [FileContents], [dteCreated], [dteLastModified], [txtDesc], [mimeID], [txtName], [txtTitle], [dteDeleted])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [92190315-1107-4848-94b3-dd9badf4465b]
-- @p1: Input VarBinary (Size = -1; Prec = 0; Scale = 0) [SqlBinary(24064)]
-- @p2: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) [10/26/2010 1:54:55 PM]
-- @p3: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) [10/26/2010 1:54:55 PM]
-- @p4: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [This is my new file]
-- @p5: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- @p6: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [MySecondTestDoc.doc]
-- @p7: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [My Other Test Document]
-- @p8: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

INSERT INTO [dbo].[UserFiles]([fileID], [userID], [rightsID])
VALUES (@p0, @p1, @p2)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [92190315-1107-4848-94b3-dd9badf4465b]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

当我查看 Server Profiler 时,它会记录 RPC:Completed exec sp_executesql "Good Insert Statement"

当我通过 Server Manager Studio 手动运行 sql 时,一切正常。我可以通过使用 SA 登录或使用 Web 服务使用的凭据成功地做到这一点。

不过,LINQ SubmitChanges 不会引发错误。它不工作的任何原因?我没有在任何部分类中重载任何 Insert/Update/DeleteFile 函数。

修改其他表似乎工作正常。我想知道它是否与 FILESTREAM 列有关。

我的连接字符串是:

Data Source=IP;Initial Catalog=MyDB;User ID=myLogin;Password=myPswd

一旦我手动将记录放入表(FILESTREAM 表)中,我就可以很好地读取该数据。

最后,我为 Transact-SQL 访问配置了 FILESTREAM,而不是为文件 i/o 流访问配置了 FILESTREAM。根据我的理解,我认为不需要将共享文件夹保存到数据位置。我希望一切都通过数据库来获取 FILESTREAM 数据。

谢谢!

固定的

我有以下代码:

public TransactionScope CreateTransactionScope(TransactionScopeOption scope, IsolationLevel level)
{
  var transactionOptions = new TransactionOptions();
  transactionOptions.IsolationLevel = level;
  transactionOptions.Timeout = TimeSpan.MaxValue;
  return new TransactionScope(scope, transactionOptions);
}
public TransactionScope CreateTransactionScope(TransactionScopeOption scope)
{
  return CreateTransactionScope(scope, IsolationLevel.ReadCommitted);
}

我的 submitchanges 看起来像:

using (var ts = db.CreateTransactionScope(TransactionScopeOption.RequiresNew, IsolationLevel.ReadUncommitted))
    {
      db.SubmitChanges(ConflictMode.FailOnFirstConflict);
    }

任何人?任何人?我忘记了完整的声明...大声笑。我在想我可能会在 submitchanges 区域添加更多内容并且可能想要回滚,所以我将 using 语句留在那里但从未提交我的更改......谢谢大家!

4

2 回答 2

1

我忘记了交易中的完整声明

于 2010-10-27T03:36:36.107 回答
0

大约一个月前,我从代码向 sql 服务器发送了一个插入查询。并且眼睁睁地看着什么事情都没有发生。没有插入记录,也没有记录错误。Profiler 显示正在提交的查询。如果我运行探查器的查询,那么它就起作用了。绝对让我大吃一惊。

然后,我高兴地检查了安全性。瞧,该站点正在执行的用户没有执行插入的权限。更新安全性后,一切都开始正常工作。

奇怪的是,绝对没有抛出错误。当我试图复制问题时,我开始遇到安全错误。我想 SQL Server 只是决定那天不报告任何内容。

你可以从那里开始。

于 2010-10-26T22:57:09.057 回答