我有一个存储过程,它返回大约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和案例,这不应该是一个问题吗? 此外,尝试谷歌搜索和敲打头 - 没有工作。
答案 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"