Mise à jour: Mon problème ne semble pas être avec le serveur SQL. J'ai exécuté manuellement une instruction de mise à jour dans la base de données par rapport à la vue et j'ai pu mettre à jour la table Barre. Je vais fermer cela et rechercher les OleDbDataAdapters plus car je pense que le problème réside avec eux.Comment déterminer quelle table d'une vue multitable peut être mise à jour?
Cette question s'applique à MS SQL Server 2000. Comment déterminer quelle table de la vue multitable peut être modifiée?
J'ai la vue suivante:
CREATE VIEW dbo.MyView
AS
SELECT dbo.Foo.Id, dbo.Bar.Id, dbo.Foo.column1, dbo.Foo.column2,
dbo.Foo.column3, dbo.Bar.column1, dbo.Bar.column2,
dbo.Bar.column3
FROM dbo.Bar INNER JOIN
dbo.Foo ON dbo.Bar.Id = dbo.Foo.ForeignId
Lorsque je mets à jour ce point de vue, (en utilisant OleDbDataAdapters VB.NET), je peux mettre à jour des colonnes de Foo, mais pas les colonnes de bar. Mon enquête sur ce sujet me dit que dans une vue multitable comme celle-ci, le serveur MS SQL vous permet seulement de mettre à jour une des tables. Donc ma question est, comment SQL Server détermine quelle table peut être mise à jour?
J'ai essayé un test dans lequel j'édite les champs d'une ligne particulière de la vue. Ensuite, j'ai utilisé OleDbDataAdapter pour mettre à jour la vue. Seules les modifications apportées à la table Foo ont été acceptées. Les modifications apportées à la table Bar ont été ignorées (aucune exception n'a été levée). Y at-il un moyen de prédire lequel des tableaux peut être mis à jour ou un moyen de contrôler lequel? Et si je voulais que Bar soit la table pouvant être mise à jour au lieu de Foo?
Mise à jour: Je trouve cela sur Google, MS SQL Server 2000 Unleased:
http://books.google.com/books?id=G2YqBS9CQ0AC&pg=RA1-PA713&lpg=RA1-PA713&dq=ms+sql+server+ "vue multitable de +" ++ mise à jour & source = bl & OTS = ZuQXIlEPbO & sig = JbgdDe5yU73aSkxh-SLDdtMYZDs & hl = fr & ei = b-0SSq-aHZOitgPB38zgDQ & sa = X & Oi = book_result & ct = résultat & resnum = 1 # PRA1-PA713, M1
(pour une raison quelconque l'URL que je suis en train de coller ne fonctionne pas avec ce site, sorr y que vous devez copier & coller)
qui dit:.
- Une mise à jour par une vue multitable ne peut affecter plus de une table de base sous-jacente.
- Une suppression ne peut pas être exécutée sur des vues multitable.
Mais, je ne vois pas encore de réponse à ma question.
Encore une fois, ma question est:
Comment puis-je déterminer quelle table de la vue multitable peut être modifié? Je réalise que je peux écrire deux instructions de mise à jour une pour chaque table. Ma préoccupation est différente. J'ai besoin de vérifier le code qui utilise des vues comme celle ci-dessus et fait des mises à jour sur les vues.J'espérais trouver un moyen de déterminer quelles parties des mises à jour seraient silencieusement ignorées.
Exemple:
je modifier Bar.Column1 puis appeler la méthode de mise à jour() du OleDbDataAdapter. Cela entraîne que la table Bar n'est pas modifiée et qu'aucune exception n'est levée. Si je modifie Foo.Column2, puis appelez Update() la table Foo est modifiée.
Lorsque vous essayez de mettre à jour la barre, mettez-vous à jour simultanément Foo? – JeffO
Parce que j'utilise le OleDbDataAdapter je ne suis pas sûr de la syntaxe SQL exacte qui est fournie à la base de données. L'adaptateur de données extrait les données directement de la vue, donc je supposais qu'il met à jour la vue et non les tables individuelles. Savez-vous comment je peux vérifier cela? –
Je dois ajouter que je comprends que la mise à jour de la vue provoque la mise à jour des tables de base. Je réalise que la vue elle-même ne contient aucune donnée. Désolé si c'était confus dans ce que j'ai écrit! –