我正在使用SQL Server后端将VB6应用程序转换为C#。该应用程序包括一个非常通用的查询编辑器,允许用户编写任何选择查询并在网格控件中可视地返回结果。有些表有几百列(设计很差,我知道,但我无法控制)。管理员用户的典型用例是
select * from A_Table_With_Many_Columns
然而,虽然他们希望能够查看所有数据,但他们对2列特别感兴趣,他们希望这些列显示为网格中的前2列(例如,而不是第67列和第99列),而是他们执行以下声明:
select First_Interesting_Field, Second_Interesting_Field, *
from A_Table_With_Many_Columns
然后他们将去修改网格中的数据。但是,在保存此数据时,会导致并发冲突(DBConcurrencyException
)。这与VB6连接的RecordSets一起运行良好,但在C#中表现不佳。我尝试了无数的解决方案无济于事。
有没有人知道如何以通用方式处理此异常? (请记住,用户可以在查询编辑器中键入任何选择语句或连接等)
有谁知道我如何操纵返回的列,以便删除列表中进一步显示的2列? (我的困难在于,如果数据库中的列名是EMail
,那么我select Email, * from Blah
返回的2个相关列为EMail
,而ADO.NET或C#别名为EMail
查询的*
部分中的列EMail1
,因此我无法将第二列检测为重复并将其删除)
有没有人有我没想过的替代解决方案?
非常感谢
答案 0 :(得分:0)
实际上,您可以通过执行以下操作将所有变量重命名为email_userdefined:
选择First_Interesting_Field作为First_Interesting_Field_userdefined,Second_Interesting_Field作为Second_Interesting_Field_userdefined,* 来自A_Table_With_Many_Columns
将user_defined替换为您想要的任何内容,例如订单号或用户可接受的任何其他内容