如何让DataSet从存储过程中识别表名?

时间:2011-01-18 18:45:07

标签: c# sql-server stored-procedures dataset

我有一个存储过程,它返回大约5个表,我将返回这样的内容:

select <fields> from Products where ProductId = @ProductId
select <fields> from RelatedProducts where ProductId = @ProductId
select <fields> from MetaData where ProductId = @ProductId
好吧,你得到了要点。现在在数据集中,如果我这样做:

DataSet ProductDs = DAL.RetreiveProductMetadata(someInteger);

ProductName = DataSet.Tables["Products"].Rows[0]["columnName"].ToString();

它抛出一个异常......好吧,错误说TableName为null并且在调试时,事实证明,表名实际上被命名为“Results1”,“Results2”等等。

我尝试将存储过程更改为:

select * From products AS Products

没效果。

如何让C#检测并使用数据库中的表名?

ps:我在现场有各种各样的Coalesces和案例,这不应该是一个问题吗? 此外,尝试谷歌搜索和敲打头 - 没有工作。

3 个答案:

答案 0 :(得分:3)

实际上可能,您只需要首先加载表格方案,其中不包含任何数据,但有关表格结构的信息,包括表格名称:

adapter.FillSchema(dataset, SchemaType.Source);
adapter.Fill(dataset);

似乎这不适用于数据库中包含的查询(就像您可能在MS Access中使用的那样),但是它可以用于常规表。

答案 1 :(得分:2)

你做不到。表名在结果集中没有意义,因为查询可以包含许多表。

知道你的结果集是什么,不应该派生表名。

否则,

select 'Products' AS ThisTable, <fields> from Products where ProductId = @ProductId

首先加入并稍后取消

或者预先定义您的dataset.xsd等并根据地图进行映射。

答案 2 :(得分:1)

从数据集中按名称检索表的唯一方法是:如果在从适配器填充时命名它,或者稍后手动将它们命名为一个表:

adapter.fill(dataset, "nameoftable")

现在,您将来访问ds时可以按名称访问; ds.tables("nameoftable").rows等。

或稍后命名。

_ds.tables(0).tablename = "nameoftable"