【问题标题】:Set dbo.Table name as DataTable Name将 dbo.Table 名称设置为 DataTable Name
【发布时间】:2023-03-28 09:41:01
【问题描述】:

我有一个返回 14 个表的存储过程。现在,在我的应用程序中,数据集包含所有 DataTable 名称为 table、table1、table2、table3 ... 的数据表。我在这里想要的是,我的数据集应该包含与数据库表名同名的所有数据表。是否可以 ?

提前致谢。

【问题讨论】:

  • 我猜同样的问题是here。简短的回答,你不能,对不起。
  • @alexb: longer answer,你可以;)
  • @Tim Schmelter 我坚持我的意见:)。我理解他的问题的方式是,他需要自动分配表名而不是手动分配,但如果我理解错了,那就是过失了
  • @NayeemKhan,您能否通过指定是否需要直接从数据库中获取表名来更新您的问题,或者只要您能够命名 System.Data.DataTable(s )
  • @alexb:恐怕你是对的。我还没有找到一种方法来获取自动返回多个结果集的 SP 的表名。尝试使用con.getSchemadataReader.GetSchemaTable 等等(BaseTable 只是null)。所以我认为你根本不应该从存储过程中返回多个结果集。当您将它们拆分为多个 proc 时,它还可能提高可读性和可重用性。

标签: c# sql


【解决方案1】:

Here您有一个要点可以帮助您进行此映射。

用法:

SomeDataSet dt = DataUtil.Fill<SomeDataSet>(
    procedureName: "someSP", 
    connectionString: "yourConnectionString", 
    values: new {
        someValue = 15,
        otherValue = "test",
    },
    mappings: new { 
        Table1: "YourDataSetTable1",
        Table2: "YourDataSetTable2",
    }
);

(最后的代码仅适用于framework 4.0)

【讨论】:

    【解决方案2】:

    您可以将TableMappings 用于您的DataAdapter 以获得正确的表名:

    using (var con = new SqlConnection(connectionString))
    {
       string sql = @"SELECT * FROM locGSP; 
                      SELECT * FROM locCountry; 
                      SELECT * FROM locMarketUnit";
       using(var da = new SqlDataAdapter(sql, con))
       {
           // demonstrate the issue here:
           DataSet dsWrong = new DataSet();
           da.Fill(dsWrong); // now all tables are in this format: Table,Table1,Table2
    
           // following will map the correct names to the tables
           DataSet dsCorrect = new DataSet();
           da.TableMappings.Add("Table", "locGSP");
           da.TableMappings.Add("Table1", "locCountry");
           da.TableMappings.Add("Table2", "locMarketUnit");
           da.Fill(dsCorrect); // now we have the correct table-names: locGSP,locCountry,locMarketUnit
       }
    }
    

    这是使用DataReaderDataSet.Load 填充DataSet 的另一种方式:

    using (var con = new SqlConnection(connectionString))
    {
       string sql = @"SELECT * FROM locGSP; 
                      SELECT * FROM locCountry; 
                      SELECT * FROM locMarketUnit";
       using (var cmd = new SqlCommand(sql, con))
       {
           con.Open();
           using (var rdr = cmd.ExecuteReader())
           {
               // after the next line the DataSet will have the correct table-names
               ds.Load(rdr, LoadOption.OverwriteChanges, "locGSP", "locCountry", "locMarketUnit");
           }
       }
    }
    

    背景:

    Populating a DataSet from a DataAdapter

    Multiple Result Sets:如果DataAdapter遇到多个结果 集,它会在 DataSet 中创建多个表。表格已给出 TableN 的增量默认名称,以“Table”开头 表 0。如果将表名作为参数传递给 Fill 方法, 表被赋予一个递增的默认名称 TableNameN, 以 TableName0 的“TableName”开头。

    【讨论】:

      【解决方案3】:

      您的过程返回 14 个结果集,而不是表。除非您特别命名它们,否则它们是未命名的结果集。比如下面查询的表名是什么?

      select c.Name,sum(o.orders) as NumOrder,sum(o.price) as TotalPrice
      from 
      customer c 
      join orders o on o.cust_id=c.cust_id
      group by c.name
      

      有效的 SQL 查询,但 SQL 不知道如何称呼这个“虚拟表”或结果集。

      【讨论】:

      • 如果他将结果提取到DataSet(基本上是DataTables 的集合)中,他可以使用@自己命名DataTables 987654325@命名设施...
      • 没错,他可以自己命名,但是 SQL 不知道如何命名
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      相关资源
      最近更新 更多