【问题标题】:How to get the DataSet to recognize the table names from stored procedure?如何让 DataSet 识别存储过程中的表名?
【发布时间】:2011-06-11 07:08:36
【问题描述】:

我有一个存储过程,它返回大约 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 和案例,应该不会有问题吧?
此外,尝试谷歌搜索和敲击头部 - 均未奏效。

【问题讨论】:

  • 当您尝试使用 int 索引表时会发生什么?
  • 当然可以,但是我尝试通过名称访问它们的目的纯粹是为了便于阅读,这样我以后就不会与 table[0] 和 [1] 混淆(或将来在我的代码上工作的任何其他编码人员)
  • 另一个愚蠢的问题:您是否尝试输入小写的表名?我记得过去有过类似的问题,但不太清楚我是如何解决的,尽管我似乎记得一些关于区分大小写的事情。
  • 嗯,关键是,当我调试时,数据集将表名显示为“Results1”.. 所以情况不会有任何不同吧?无论如何我都会试试,以防万一
  • 不,不走运,正如我所说,DataSet 没有任何表名信息

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


【解决方案1】:

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

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

否则,

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

或者先加入再取消选择

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

【讨论】:

  • 是的,我确实知道我的结果集将是什么,但我只是想让下一个人更容易查看我的代码。哦,好吧,如果它给了我额外的工作,最好有生产力并继续前进!谢谢!
  • @iamserious:如果这是一个存储库或 DAL,您可以将数据表隐藏到更高级别的代码。我们使用来自 procs 的多个结果集,但从未将您报告的问题视为问题...
  • 您能详细说明一下吗?在我的 DAL 中,我几乎没有强类型数据集和存储过程,它们并不真正适合任何表适配器,因此我有一个类文件来执行存储过程并返回结果。您如何通过代码访问它们?
  • @iamserious:我必须与其他开发人员一起检查细节,但 Tables[0] 等只出现在一个地方,所以它被隐藏了。或者至少评论很好......
  • 我终于手动重命名了我的表,比如 Tables[0].TableName = "whatever"
【解决方案2】:

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

adapter.fill(dataset, "nameoftable")

现在当你以后访问ds时,你可以通过名字访问; ds.tables("nameoftable").rows

或稍后命名。

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

【讨论】:

    【解决方案3】:

    其实是可以的,只需要先加载table scheme,里面不包含数据,只包含表结构的信息,包括表名:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2011-11-08
      • 2017-07-10
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多