2009-06-05 4 views
6

Je me bats contre un concepteur de DataSet VS2008 récalcitrant, semble-t-il. J'ai essayé de faire ce qui semble être une simple solution de jeu de données à 2 tables, où une table est simplement la signification textuelle d'une valeur entière stockée dans l'autre table. conception de données de base 101.Qu'est-il arrivé aux commandes Update et Delete de ma TableAdapter?

Table1 
CharField1 
CharField2 
IntForeignKeyField1 
etc 

Table2 
IntPrimaryKey1 
ValueForKeyField 

Cela n'affecte pas vraiment le problème que j'ai, je ne crois pas, comme je ne suis pas envie de faire quoi que ce soit, mais lire les valeurs de la deuxième table je peux choisissez-les dans un DataGridViewComboBoxColumn dans le client - je ne les éditerai jamais sur le client. Mais, je m'égare. Puisqu'il vit dans un service web, et je voulais un jeu de données fortement typé livré aux clients de ce service web, j'ai décidé d'utiliser le DataSet Designer pour construire les TableAdapters et toute la plomberie, pensant qu'il pourrait être moins travail et plus facile à maintenir. J'ai donc créé les jolies boîtes et édité les instructions select, en demandant au concepteur de créer toutes les commandes Insérer, Mettre à jour et Supprimer pour l'adaptateur de table à utiliser. Il a heureusement obligé, m'informant que tout a été fait comme je l'ai demandé.

Lorsque j'ai essayé d'utiliser l'instruction Update, cependant, j'ai reçu une erreur indiquant qu'il n'y avait pas d'instruction Update valide! Après une recherche infructueuse de personnes ayant des problèmes similaires sur le web, j'ai creusé le XML pour l'ensemble de données. Effectivement, pas d'instruction Update, et pas d'instruction Delete non plus.

J'ai essayé de supprimer complètement et de recréer le DataSet du projet, avec les mêmes résultats. Aucune instruction Update ou Delete n'a été créée, même si elle a été signalée comme terminée.

J'ai fini par créer l'instruction Update XML à la main, en inspectant un autre ensemble de données conçu à partir d'un autre projet, de sorte que le service Web fonctionne maintenant. Cependant, je ne crois pas du tout que mes changements dureraient grâce à une modification initiée par le concepteur, et je suis perplexe quant à savoir pourquoi cela ne fonctionne pas. Des idées?

Merci pour tous les commentaires, Dave

+1

De l'absence totale de commentaires, je suppose que cela n'a pas eu à quelqu'un d'autre, donc j'avoir un vrai bug ou problème dans ma mise en œuvre de VS2008. Génial. Et j'ai aussi reçu un insigne «tumbleweed» pour le privilège. – DaveN59

Répondre

13

pourrait-il qu'il n'y a pas de clé primaire unique définie pour la table?

+0

Doh! Merci de remarquer l'évidence ... – DaveN59

+0

ne se sentent pas à merdique à ce sujet, je viens de faire la même chose :(Réglage du PK dans la base de données fixe le même problème pour moi. – sMaN

0

J'ai le même problème. Le TableAdapter ne fonctionne pas correctement lors de l'utilisation des champs de plusieurs tables. J'ai été en mesure de recréer la solution à partir de l'article suivant: "Mise à jour du TableAdapter pour utiliser Jointures".

http://www.asp.net/learn/data-access/tutorial-69-vb.aspx

La solution consiste à créer votre propre Select/Mise à jour/Insérer/Supprimer des procédures. Malheureusement, alors que j'étais capable de suivre la solution pour une base de données sqlserver, je ne suis toujours pas capable de l'utiliser pour ma base de données Access locale. Toutes les options de procédure stockée sont grisées.

Bonne chance!

+0

Merci pour le lien vers l'article. Cependant, mon Le problème (et peut-être aussi le vôtre) est plus simple: il suffisait de définir des clés primaires et une relation dans le concepteur de SQL Studio, et VS l'aimait bien, je ne sais pas à quoi ressemblent vos données, mais VS peut obtenir un peu d'information de SQL Server - ou pas, apparemment – DaveN59

0

Je pense avoir trouvé la solution. 1) Créez un TableAdapter pour la table principale uniquement et copiez la procédure TableAdapter UPDATE (stockée dans la fenêtre Propriétés TableAdapter) 2) Modifiez la requête SELECT dans le "Générateur de requêtes de l'assistant de configuration TableAdapter" pour inclure les champs des tables et de la jointure. 3) Collez l'ancienne procédure UPDATE dans la procédure TableAdapter UPDATE maintenant vide. 4) Après avoir créé DataGridView, vous pouvez afficher les champs des deux tables et mettre à jour la table principale. Répétez les étapes pour INSERT & commandes DELETE.

Si votre objectif est de mettre à jour les deux tables, essayez de regarder dans TableAdapter Parent/mettre à jour les informations des enfants sur le web. Voici un bon lien: http://blogs.msdn.com/bethmassi/archive/2009/05/14/using-tableadapters-to-insert-related-data-into-an-ms-access-database.aspx

+0

Trop de travail! :) C'est essentiellement ce que j'ai fait pour le faire fonctionner. Cependant, cela fonctionnait beaucoup mieux et sans rien changer manuellement, quand j'ai défini les clés primaires et les relations dans la base de données - VS2008 a trouvé comment faire ce qu'il devait faire à partir de cette information, sans intervention manuelle ... – DaveN59

+0

Vous avez cette solution à travailler pour MS Access? J'ai ce problème précis et j'essaie de faire fonctionner votre méthode. –

0

Juste couru dans le même problème de base. J'ai dit au concepteur de données de créer toutes les instructions d'insertion, de mise à jour et de suppression. Quand je suis allé mettre à jour l'une des tables, il n'y avait pas de mise à jour disponible. Je suis finalement allé dans le fichier .xsd créé par le concepteur de données (juste double-cliqué pour l'ouvrir dans l'IDE). J'ai alors fait un clic droit sur la barre de titre de la table qui avait le problème et sélectionné l'option de configuration. De là, j'ai cliqué sur le bouton «Options avancées», puis sélectionné l'option «Générer insérer, mettre à jour, supprimer les déclarations». Après avoir appuyé sur OK, j'ai vérifié mon projet et la mise à jour était disponible pour l'adaptateur de table.

0

Ce que George a suggéré est grande. Nous devons activer l'option 'Générer l'insertion, mettre à jour, supprimer les déclarations'.

Cependant, dans VS2013, en utilisant des qualificatifs de table inutiles dans la déclaration de SELETE peut perturber l'IDE et entraîner la génération de SELECT et INSERT déclarations uniquement. Retirez simplement ces qualificatifs et ça devrait aller. Assurez-vous d'avoir un PK unique aussi.

Si vous avez besoin d'utiliser remplissage compliqué comme application du filtre pour retourner certaines lignes de la table uniquement, vous pouvez remplir le tableau de données à l'aide instruction select spécifique en cas de charge de forme. De cette façon, les instructions INSERT, UPDATE et DELETE générées continueront à fonctionner, car DELETE et UPDATE fonctionnent sur le PK.