Question

J'ai un code qui insère des données dans des tables (une table a une colonne FILESTREAM) et appelle ensuite SubmitChanges après avoir été fait.

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

J'ai référencé les liens suivants, mais ils semblent ne pas être mon problème:

LINQ to SQL: SubmitChanges () ne fonctionne pas ?

LINQ pas mise à jour sur .SubmitChanges ()

Chaque table a une clé primaire. text alt

Je 14 tableaux et je vois 14 IsPrimaryKey = true contenu dans les linq.designer.cs

Bien que je ne vois que « AutoSync = AutoSync.OnInsert » manque de la table des fichiers mais je pense que c'est parce que l'identité est pas définie (en utilisant guid comme clé primaire).

Quand je vérifie la base de données, rien n'a été inséré dedans. Les spectacles de 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

Quand je regarde Profiler serveur il enregistre RPC: terminé exec sp_executesql "Good Insérer Déclaration"

Quand je lance le SQL manuellement via Studio Server Manager, tout fonctionne bien. Je peux le faire soit avec succès par l'exploitation forestière avec SA ou avec les informations d'identification utilisées par le service Web.

LINQ SubmitChanges est de ne pas jeter une erreur cependant. Toute raison pour laquelle il ne fonctionne pas? Je n'ai pas surchargé des fonctions d'insertion / mise à jour / DeleteFile dans toutes les classes partielles.

Modification d'autres tables semblent fonctionner bien que. Je me demande si elle a à voir avec la colonne FILESTREAM.

Ma chaîne de connexion est:

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

Une fois que je mets manuellement l'enregistrement dans la table (table FILESTREAM), je peux lire que les données très bien.

Enfin, j'ai FILESTREAM configuré pour l'accès Transact-SQL et non pour le fichier i / o l'accès en continu. De la façon dont je l'ai compris, je ne voyais pas besoin d'avoir un dossier partagé à l'emplacement des données. Je voulais que tout se passe dans la base de données pour obtenir les données FILESTREAM.

Merci!

FIXE

Je le code suivant:

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);
}

et mes SubmitChanges ressemblaient à:

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

? n'importe qui? J'ai oublié la déclaration complète ... lol. Je pensais que je pourrais ajouter plus dans la zone SubmitChanges et pourrait vouloir rollback alors je suis parti de la déclaration à l'aide, mais il ne commettrait jamais mes changements ... Merci à tous!

Était-ce utile?

La solution

J'ai oublié l'intérieur de la déclaration complète de la transaction

Autres conseils

Il y a environ un mois j'ai envoyé une requête d'insertion de code au serveur SQL. Et absolument rien ne se passe vu. Aucun enregistrement n'a été inséré et aucune erreur enregistrées. Profiler a montré la requête soumise. Si je couru la requête qui avait profileur, il a travaillé. Absolument boggled mon esprit.

Alors, sur une alouette, j'ai vérifié sur la sécurité. Lo et voici l'utilisateur du site exécutait sous ne dispose pas des autorisations pour effectuer l'insertion. Après la mise à jour de la sécurité, tout a commencé à travailler très bien.

chose étrange est que absolument aucune erreur n'a été levée. Quand j'ai essayé de reproduire le problème, j'ai commencé à obtenir des erreurs de sécurité. Je me suis dit serveur SQL simplement décidé de ne pas signaler tout ce jour-là.

Vous pourriez commencer par là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top