2009-06-04 13 views
0

Quelle est la bonne façon d'éviter les erreurs sur INSERT et UPDATES avec un SqlDataAdapter/SqlCommandbuilder lorsque l'instruction SQL utilisée pour SELECT a une colonne calculée comme l'un des champs de retour?SqlCommandBuilder et SQL Server Computed Columns - Erreur

Je reçois l'erreur maintenant que "La colonne Amount ne peut pas être modifiée car elle est soit une colonne calculée soit le résultat d'un opérateur UNION".

MISE À JOUR: Je résolu le problème en utilisant une requête comme ceci:

SELECT *, PercentRating * 500 AS CoreValue FROM ValueListings 

Et amerrissage forcé la colonne calculée. Maintenant ça marche. Comment SqlCommandBuilder réalise-t-il que PAS génère le champ CoreValue dans les instructions UPDATE et INSERT? Quelqu'un sait comment cela fonctionne en interne?

+0

bonnes nouvelles avec votre solution, la honte de votre aide de la redoutée sélectionnez la notation des étoiles! –

+0

Quel est le problème avec la notation select *? J'essaye de garder le SQL simple parce que ces déclarations sont incorporées dans un DSL. – BuddyJoe

+0

Le problème avec l'utilisation de select * est que cela peut affecter les performances, en fonction du nombre d'enregistrements et de colonnes que contient cette table. Par exemple, si vous n'avez besoin que de 3 colonnes sur une table avec 8 colonnes, il est préférable d'appeler select column1, column2, column3 au lieu de select * car cela retournera beaucoup de données dont vous n'avez pas besoin. –

Répondre

0

Si vous pouvez éviter d'utiliser le *, il vous épargnera des problèmes plus tard. Avec * si vous changez le schéma, votre code peut se casser. Si les champs nommés, vous êtes bon.

1

Utilisez la phrase:

SELECT * FROM ValueListings

Puis, après Remplissez le DataTable, ajoutez une colonne calculée à elle:

Dim Dt as new DataTable 
    Da.Fill(Dt) 
    Dt.columns.add("CoreValue", GetType(Double), "PercentRating * 500")