2008-11-10 6 views
1

J'ai un traitement par lots qui lit les données de plusieurs tables dans un jeu de données basé sur une clé commune. Je construis ensuite un deuxième ensemble de données de l'interrogation de données de destination sur la même clé. À ce stade, j'ai deux Datasets qui sont structurellement identiques (d'une perspective de mise en page de table/colonne). J'ai alors un processus qui ajoute n'importe quelle ligne qui existe dans la source à l'ensemble de données de destination. En outre, le processus tentera également de mettre à jour certaines colonnes en fonction de la clé commune.Utilisation de DataAdapter. Mise à jour pour insérer/mettre à jour des lignes dans un jeu de données (non basé sur des PK) problème

Le problème semble se produire lorsque la commande DataAdapter.UPDATE est appelée avec des lignes existantes à mettre à jour. Erreur: System.InvalidOperationException was unhandled Message = "La table spécifiée dans l'instruction SELECT ne contient pas de colonne de clé ou d'identifiant unique, ou l'instruction SELECT n'inclut pas toutes les colonnes de clé."

Puisque je n'ai aucun moyen de contrôler ce que le PK est sur la base de données de destination, est-il possible de dire à l'adaptateur quelle est la clé pour cette mise à jour particulière? J'ai "personnalisé" définir les clés primaires pour chaque DataTable dans l'ensemble de données.

Il s'agit d'un processus par lots d'interfaçage sans utilisateur et ses exigences de performances sont assez faibles. (pour expliquer l'utilisation des ensembles de données, etc.)

Des pensées?

Répondre

0

Vous devez définir le PK pour chaque table dans l'ensemble de données comme vous l'avez fait. Je ne pense pas qu'il existe un moyen pour l'adaptateur de comprendre ce que les PK sont en soi. s'il y a et quelqu'un le sait je suis tout ouïe.

+0

J'ai mis le PK et continue d'obtenir l'erreur (qui dans les documents d'aide indique que la DB réelle n'a pas de PK viable) – WIDBA

1

profile la base de données et de voir quelles requêtes sont lancées. Copiez les requêtes de Profiler et essayez de les exécuter manuellement. si elles échouent, alors le problème est avec le sql et l'erreur vient de la base de données et est simplement passée à votre application.

cela devrait au moins dire si le problème est causé par l'absence de véritables PK dans le db.

Questions connexes