0

いくつかのテーブルにデータを挿入し(1つのテーブルには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」がFilesテーブルにないことはわかりますが、これは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:Completed exec sp_executesql "GoodInsertStatement"が記録されています。

Server Manager Studioを介してSQLを手動で実行すると、すべてが正常に機能します。SAまたはWebサービスで使用されるクレデンシャルを使用してログインすることで、これを正常に実行できます。

ただし、LINQSubmitChangesはエラーをスローしません。それが機能しない理由は何ですか?部分クラスのInsert/Update/DeleteFile関数をオーバーロードしていません。

ただし、他のテーブルの変更は正常に機能しているようです。FILESTREAM列と関係があるのだろうかと思います。

私の接続文字列は次のとおりです。

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

レコードをテーブル(FILESTREAMテーブル)に手動で配置すると、そのデータを正常に読み取ることができます。

最後に、ファイルI / Oストリーミングアクセスではなく、Transact-SQLアクセス用に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

約1か月前、コードからSQLサーバーに挿入クエリを送信しました。そして、絶対に何も起こらないのを見ました。レコードは挿入されず、エラーも記録されませんでした。プロファイラーは、送信されているクエリを示しました。プロファイラーが持っていたクエリを実行した場合、それは機能しました。絶対に頭がおかしくなった。

それから、ひばりで、私はセキュリティをチェックしました。サイトが実行されていたユーザーには、挿入を実行する権限がありませんでした。セキュリティを更新した後、すべてが正常に機能し始めました。

奇妙なことに、エラーはまったくスローされませんでした。問題を再現しようとすると、セキュリティエラーが発生し始めました。私は、SQLサーバーがその日は何も報告しないことに決めたと思いました。

あなたはそこから始めるかもしれません。

于 2010-10-26T22:57:09.057 に答える