我正在编写一个存储过程,该过程执行几个连续的SELECT
语句。当我通过ADO.NET执行此过程时,我的目的是以包含几个DataTable
对象的DataSet
结束。这符合预期。
我目前依赖于DataSet
中表的顺序来匹配存储过程中SELECT
语句的顺序,但是这个顺序实际上没有什么意义,最终维护过程的人不应该知道结果的预期顺序,维持申请的人也不必知道程序中陈述的顺序。
我想知道的是,是否可以在存储过程本身中为每个SELECT
语句的结果赋值,然后通过ADO.NET(希望是无缝的)传递这些结果,以便我可以按名称而不是顺序访问每个表?
例如:
// populate DataSet with results from stored proc
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
// now access one of the resulting DataTable via name
return ds.Tables["NamedResultFromTheProc"];
那么,有什么方法可以实现这个目标呢?或者我必须依赖于SELECT
语句的顺序,并且总是通过索引访问所需的表吗?
6条答案
按热度按时间xvw2m8pv1#
我没有尝试过这种方法,但是您可以不更改存储过程的结构,以便在每次数据查询之前都有一个返回表名的查询吗?
即
然后通过创建表并添加表来手动构建数据集?
wtzytmuj2#
查询返回的表将被命名为“Table”、“Table1”、“Table2”等。
您可以在填充数据集之前将TableMappings添加到DataAdapter,以将它们Map到表名:
0tdrvxhp3#
不幸的是,我不相信这是可能的!我有一个类似的设置,从存储过程中获取数据集,看了之后我放弃了,求助于索引。
yyyllmsg4#
这也不是最佳解决方案,但您可以将查询中的第一列设为表名:
jk9hmnmh5#
这是不可能的,但它的SQL“错误”,而不是DataAdapter/Set的错误,因为结果集不携带所查询的表的名称(如果您使用内部连接,这也是不可能的),表适配器也没有从中选取名称的查询。您可以使用的一种方法是首先在过程中返回一个表列表作为Query#0,例如:
接着是所有其他查询,然后读取索引0表和此字段,split/forloop以重命名数据集中的其他表。维护者仍然需要了解机制,但至少它给了他一些重组的自由。
nbysray56#
我也一直在考虑这个问题,我能想到的唯一解决方案是在过程中创建临时表,并将结果填充到其中(根据需要命名表)。
我还没有尝试过这个方法,因为它感觉不像是正确的方法,因为必须获得两次结果(查询到临时表,查询临时表)。
如果您可以用SQL重命名结果集,就像重命名“Column AS [Custom Column]"一样,这将非常有用...