我有以下存储过程
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,如果这有所不同.
据我所知,从存储过程中,你不能这样做.但是,您可以在检索DataSet后设置名称,然后再使用它们.
ds.Tables[0].TableName = "NametbA";
存储过程:
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; }
希望这可以帮助
有没有理由在填写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"语句中,并不是每个表都会得到一个名称.