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

Bra*_*ann 37 .net sql sql-server dataset

我有以下存储过程

Create procedure psfoo ()
AS
select * from tbA
select * from tbB
Run Code Online (Sandbox Code Playgroud)

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

     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);
Run Code Online (Sandbox Code Playgroud)

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

     DataTable datatableA = ds.Tables[0];
     DataTable datatableB = ds.Tables[1];
Run Code Online (Sandbox Code Playgroud)

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

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

     DataTable datatableA = ds.Tables["NametbA"];
     DataTable datatableB = ds.Tables["NametbB"];
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ier 32

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

ds.Tables[0].TableName = "NametbA";
Run Code Online (Sandbox Code Playgroud)


Tha*_*amy 8

存储过程:

    select 'tbA','tbB','tbC' 
    select * from tbA
    select * from tbB
    select * from tbC
Run Code Online (Sandbox Code Playgroud)

前端:

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

希望这可以帮助


Mat*_*ton 6

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

mySqlDataAdapter.Fill(ds);
ds.Tables[0].TableName = "NametbA";
ds.Tables[1].TableName = "NametbB";
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

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

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

  • 仍然很丑,但可能更少:返回一个表(第一个),为下表的每个表名保存一行. (3认同)
  • 我的替代解决方案是返回空占位符,以便我可以依赖索引.但感觉不对:( (2认同)