C# 为SQL Server结果集中的表指定名称

C# 为SQL Server结果集中的表指定名称,c#,.net,sql-server,ado.net,dataset,C#,.net,Sql Server,Ado.net,Dataset,我正在编写一个存储过程,它执行几个连续的SELECT语句。当我通过ADO.NET执行此过程时,我的目的是最终得到一个包含多个DataTable对象的数据集。这与预期的一样 我目前依赖数据集中表的顺序来匹配存储过程中SELECT语句的顺序,但是这种顺序实际上没有什么意义。最终必须维护程序的人不必知道结果的预期顺序,维护应用程序的人也不必知道程序中语句的顺序 我想知道的是,是否可以为存储过程本身中每个SELECT语句的结果指定名称,然后通过ADO.NET无缝地完成这些操作,以便我可以按名称而不是顺序

我正在编写一个存储过程,它执行几个连续的SELECT语句。当我通过ADO.NET执行此过程时,我的目的是最终得到一个包含多个DataTable对象的数据集。这与预期的一样

我目前依赖数据集中表的顺序来匹配存储过程中SELECT语句的顺序,但是这种顺序实际上没有什么意义。最终必须维护程序的人不必知道结果的预期顺序,维护应用程序的人也不必知道程序中语句的顺序

我想知道的是,是否可以为存储过程本身中每个SELECT语句的结果指定名称,然后通过ADO.NET无缝地完成这些操作,以便我可以按名称而不是顺序访问每个表

e、 g


那么,有没有办法做到这一点?或者我必须依赖SELECT语句的顺序并始终通过其索引访问所需的表吗?

不幸的是,我认为这是不可能的!我有一个类似的设置,它从存储过程中获取数据集,在查看之后,我放弃了并求助于索引。

这是不可能的,但它的SQL错误,而不是DataAdapter/Set的错误,因为结果集不包含查询的表的名称,如果使用内部联接,也不存在可以从中选择名称的表适配器查询,则结果集不可能包含查询的表的名称。 您可以使用的一种方法是首先在过程中以Query0的形式返回表列表,例如

select 'MyTable;MySecondTable;ThirdOrSo' as tables

接着是所有其他查询,然后读取索引0表和此字段,拆分/forloop以重命名数据集中的其他表。维护人员仍然需要知道该机制,但至少它给了他一些重新组织的自由。

查询返回的表将被命名为Table、Table1、Table2等

在填充数据集之前,可以将TableMappings添加到DataAdapter,以将其映射到表名:

myAdapter.TableMappings.Add("Table", "MyTable1");
myAdapter.TableMappings.Add("Table1", "MyTable2");
myAdapter.TableMappings.Add("Table2", "MyTable3");

我没有尝试过这个方法,但是您能否更改存储过程的结构,以便在每次数据查询之前都有一个返回表名的查询

i、 e


然后通过创建表并将其添加到中来手动构建数据集?

我也一直在考虑这个问题,我能想到的唯一解决方案是在过程中创建临时表,并将结果填充到其中,同时命名表

我还没有尝试过这个方法,因为这样做感觉不太正确,因为必须将结果两次查询到temp表,查询temp表


如果您可以使用与将列重命名为[自定义列]相同的方式在SQL中重命名结果集,这将非常有用。

这也不是最佳解决方案,但您可以将查询中的第一列设置为表名:

    Select 'Customer', CustomerID, CustomerName, CustomerAddress
    From Customer
    Where CustomerID = @CustomerID

    Select 'Orders', OrderID, OrderPrice, OrderDate
    From Order O
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID

    Select 'OrderItems', ItemID, ItemDescription, ItemPrice
    From OrderItems I
    Join Order O on O.OrderID = I.OrderID
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID

这并不能解决post的初始问题,即过程维护者不必担心查询顺序的能力。这并不能完全满足他的要求:他仍然需要编写SP代码,以特定顺序返回结果集。在我看来,这是一个合理的限制。但之后,他可以通过名称而不是索引访问结果数据集中的表,并限制将结果返回给填充数据集的DAL类的顺序;你的建议在一定程度上有所帮助,尽管并不理想。至少这会让数据库而不是客户端应用程序承担处理错误的责任。这会解决问题,但仍会让维护程序的人员遵守该约定。我希望有一个更紧密的解决方案,这是由T-SQL直接支持的,但似乎不存在这样的功能。
select 'TableName'
select * from Table where 1 = 1
    Select 'Customer', CustomerID, CustomerName, CustomerAddress
    From Customer
    Where CustomerID = @CustomerID

    Select 'Orders', OrderID, OrderPrice, OrderDate
    From Order O
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID

    Select 'OrderItems', ItemID, ItemDescription, ItemPrice
    From OrderItems I
    Join Order O on O.OrderID = I.OrderID
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID