2010-10-26 53 views
0

我有一些代碼將數據插入某些表(一個表有一個FILESTREAM列),然後在完成後調用SubmitChanges。LINQ to SQL SubmitChanges不工作FILESTREAM表

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

我有參考以下鏈接,但他們似乎不是我的問題:

LINQ to SQL: SubmitChanges() does not work?

LINQ not updating on .SubmitChanges()

每個表都有一個主鍵。 alt text

我有14桌,我看到14 IsPrimaryKey =真包含於linq.designer.cs

雖然我看到「自動同步= 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 

當我看着服務器探查它記錄RPC:完成EXEC sp_executesql的「好INSERT語句」

當我通過服務器管理工​​作室手動運行該SQL,一切工作正常。我可以通過使用SA登錄或使用Web服務使用的憑證成功執行此操作。

LINQ SubmitChanges雖然沒有拋出一個錯誤。任何它不工作的原因?我沒有重載任何部分類中的任何Insert/Update/DeleteFile函數。

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

我的連接字符串是:

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

一旦我手動將記錄到表(表FILESTREAM),我可以讀取數據就好了。

最後,我將FILESTREAM配置爲用於Transact-SQL訪問,而不是用於文件I/O流式訪問。從我的理解來看,我沒有看到需要共享文件夾到數據位置。我希望一切都通過數據庫到達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區域添加更多,並可能想要回滾,所以我離開了使用語句,但從未提交我的更改...謝謝大家!

+0

這裏是奇怪的事情。我做了一個新的數據庫和一個新的控制檯應用程序,直接連接到測試數據庫,它工作正常。所以我改變控制檯應用程序li​​nqs與我的其他數據庫(我有問題的)一起工作,並且它工作正常!因此,如果您正在使用帶有文件流的Web服務,您是否需要在文件組寫入的文件夾上設置任何特殊權限? – BabelFish 2010-10-27 02:06:09

回答

1

我忘記了交易內完成的聲明

+0

很高興你發現了這個問題。我相信你可以將自己的答案標記爲明天真正的「答案」。 – NotMe 2010-10-27 04:14:46

0

大約一個月前,我從代碼向sql server發送插入查詢。並沒有看到任何事情發生。沒有記錄被插入,沒有記錄錯誤。分析器顯示查詢正在提交。如果我運行該分析器所具有的查詢,那麼它就起作用了。絕對令我難以置信。

然後,在百靈,我檢查了安全。看到網站執行的用戶沒有執行插入的權限。更新安全性後,一切都開始正常工作。

奇怪的是,絕對沒有錯誤被拋出。當我試圖複製問題時,我開始出現安全錯誤。我想SQL Server只是決定不報告任何一天。

您可能從那裏開始。

+0

用戶將db_datareader和db_datawriter作爲數據庫角色成員身份啓用。我需要啓用什麼特別的文件流? – BabelFish 2010-10-26 23:01:14

+0

@BabelFish:你確定這是訪問數據庫的用戶嗎?在剖析器中查看LoginName列。另外,我們正在使用FileStream而不提供I/O流式訪問。這工作得很好。 – NotMe 2010-10-27 02:25:38

+0

是的,我看到了我想要的登錄名。我在測試應用程序上使用的憑據是哪些,哪些是有效的。 – BabelFish 2010-10-27 02:41:23

相關問題