当前位置:  开发笔记 > 后端 > 正文

如何命名在存储过程中返回的数据集表?

如何解决《如何命名在存储过程中返回的数据集表?》经验,为你挑选了3个好方法。

我有以下存储过程

Create procedure psfoo ()
AS
select * from tbA
select * from tbB

然后我以这种方式访问​​数据:

     Sql Command mySqlCommand = new SqlCommand("psfoo" , DbConnection)
     DataSet ds = new DataSet();
     mySqlCommand.CommandType = CommandType.StoredProcedure;
     SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
     mySqlDataAdapter.SelectCommand = mySqlCommand;
     mySqlDataAdapter.Fill(ds);

现在,当我想访问我的表时,我必须这样做:

     DataTable datatableA = ds.Tables[0];
     DataTable datatableB = ds.Tables[1];

数据集Tables属性也通过字符串(而不是int)获得了一个访问器.

是否有可能在SQL代码中指定表的名称,以便我可以写这个:

     DataTable datatableA = ds.Tables["NametbA"];
     DataTable datatableB = ds.Tables["NametbB"];

我正在使用SQL Server 2008,如果这有所不同.



1> David Wengie..:

据我所知,从存储过程中,你不能这样做.但是,您可以在检索DataSet后设置名称,然后再使用它们.

ds.Tables[0].TableName = "NametbA";



2> Thangamani ..:

存储过程:

    select 'tbA','tbB','tbC' 
    select * from tbA
    select * from tbB
    select * from tbC

前端:

       int i = 1;
       foreach (string tablename in dsEmailData.Tables[0].Rows[0][0].ToString().Split(','))
       {
           dsEmailData.Tables[i++].TableName = tablename;
       }

希望这可以帮助



3> Matt Hamilto..:

有没有理由在填写DataSet后无法手动命名它们?

mySqlDataAdapter.Fill(ds);
ds.Tables[0].TableName = "NametbA";
ds.Tables[1].TableName = "NametbB";

我不知道如何命名从存储过程中作为多个结果集的一部分返回的DataTables,但如果您知道存储过程返回的内容,那么手动命名它们应该可以正常工作.

编辑

知道您可以控制存储过程,一种替代方法可能是在表示表名的结果集中添加一列.然后你可以做类似的事情:

foreach (DataTable table in ds.Tables)
{
    table.TableName = table.Rows[0]["TableName"].ToString();
}

但是,这依赖于实际包含行的存储过程返回的结果集.如果它们不包含行,那么您必须将它包装在"if"语句中,并不是每个表都会得到一个名称.


仍然很丑,但可能更少:返回一个表(第一个),为下表的每个表名保存一行.
我的替代解决方案是返回空占位符,以便我可以依赖索引.但感觉不对:(
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有