2013-04-29 1 views
0

Je convertis une application VB6 en C# avec un backend SQL Server. L'application inclut un éditeur de requête très général qui permet à l'utilisateur d'écrire n'importe quelle requête sélectionnée et de renvoyer les résultats visuellement dans un contrôle de grille. Certaines tables ont plusieurs centaines de colonnes (mauvaise conception, je sais mais je n'ai aucun contrôle sur cela). Un cas d'utilisation typique pour un utilisateur d'administration serait deSélection de la même colonne à partir de la même table plusieurs fois dans la même instruction

select * from A_Table_With_Many_Columns 

Cependant, alors qu'ils veulent être en mesure d'afficher toutes les données, ils sont particulièrement intéressés à 2 colonnes et ils veulent que ces être affiché comme la première 2 colonnes dans la grille (au lieu de 67e et 99e par exemple) de sorte qu'au lieu qu'ils exécutent la déclaration suivante:

select First_Interesting_Field, Second_Interesting_Field, * 
from A_Table_With_Many_Columns 

Ensuite, ils iront et modifier les données dans la grille. Cependant, lors de l'enregistrement de ces données, il en résulte une violation de la concurrence (DBConcurrencyException). Cela a bien fonctionné avec les RecordSets connectés de VB6 mais pas si bien en C#. J'ai essayé une myriade de solutions en vain.

  1. Est-ce que quelqu'un sait comment gérer cette exception de manière générique? (Rappelez-vous, l'utilisateur peut taper N'IMPORTE QUELLE déclaration ou joindre etc. dans l'éditeur de requête)

  2. Est-ce que quelqu'un sait comment je peux manipuler les colonnes retournées de telle sorte que je supprime les 2 colonnes qui apparaissent plus loin dans la liste? (Ma difficulté ici est que si le nom de colonne dans la base de données est EMail donc je fais select Email, * from Blah les 2 colonnes pertinentes retournées sont EMail et ADO.NET ou C# alias la deuxième EMail colonne de la partie * de la requête comme EMail1 donc je ne suis pas capable de détecter la deuxième colonne en double et retirez-le)

  3. quelqu'un at-il une solution de rechange que je ne l'ai pas pensé?

Merci beaucoup

+0

La requête renvoie-t-elle un objet DataTable? –

+0

Oui, il finit dans un DataTable lié à un Infragistics UltraGrid. – user2333990

Répondre

0

En fait, vous pouvez renommer toutes les variables à quelque chose comme email_userdefined en faisant quelque chose comme ceci:

SELECT First_Interesting_Field comme First_Interesting_Field_userdefined, Second_Interesting_Field comme Second_Interesting_Field_userdefined, * de A_Table_With_Many_Columns

Remplacer user_defined avec ce que vous voulez, comme le numéro de commande ou tout autre utilisateur acceptable

+0

J'ai essayé cela en vain. J'ai aliasé les 2 colonnes sélectionnées individuellement. Inversement, si je n'alias PAS la première itération de la colonne dans les 2 colonnes sélectionnées individuellement avant le "*", C# ou ADO.NET alias les 2 colonnes correspondantes de la "Select *". Pourtant, la violation de la concurrence existe toujours. – user2333990

Questions connexes