【问题标题】:Populate Dataset With Table Names From Stored Procedure使用存储过程中的表名填充数据集
【发布时间】:2012-02-14 09:24:02
【问题描述】:

我有一个返回多个表的存储过程。

它正确填充了我的数据集,但它命名了我的表 [Table,Table1,Table2,...]。

我可以在数据库层(到我的存储过程)中添加一些东西来正确命名表吗?

【问题讨论】:

    标签: sql-server sql-server-2008 stored-procedures dataset asp.net-4.0


    【解决方案1】:

    您的 SP 实际上并没有返回多个表,它从您的表中返回选择的列和行,因此没有“表名”,因此它们被命名为 table1、table2 等。如果它很重要,你可以为每个选择返回一个额外的列,并在该列中用所需的名称填充它,然后从那里使用它。

       select *,'MyTableName1' As [TableName] name from mytablename1
       select *,'MyTableName2' As [TableName] name from mytablename2
    

    【讨论】:

      【解决方案2】:

      在存储过程中:

      select  CH.PrimaryKey, CH.Name,
              NULL    "CustomerHeader"
      from CustomerHeader "CH";
      --
      select  CD.PrimaryKey, CD.ShipTo,
              NULL    "CustomerDetail"
      from CustomerDetail "CD";
      --
      select  *, NULL "Orders"
      from    OrderTable;
      

      在 Vb.Net 代码中:

      Dim ds As DataSet = Nothing
      ds = SqlExecute();
      Dim dtCustHeader As DataTable = Nothing
      Dim dtCustDetail As DataTable = Nothing
      Dim dtOrders As DataTable = Nothing
      For Each dt As DataTable In ds.tables
          Select Case True
              Case dt.Columns.Contains("CustomerHeader")
                  dtCustHeader = dt
              Case dt.Columns.Contains("CustomerDetail")
                  dtCustDetail = dt
              Case dt.Columns.Contains("Orders")
                  dtOrders = dt
          End Select
      Next
      

      您无法在结果集中命名表,这有点愚蠢(或愚蠢)。 但这可以让您到达那里,而无需在每一行中重复表名的巨大字节数。

      为每一行传回 NULL 值仍然存在开销。也许传递一个 BIT 值会更小......

      另一种方法是始终使用 column(0): 在 SQL 中:

      select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail;
      

      在 vb.net 中:

          Dim ds As DataSet = Nothing
          ds = SqlExecute();
          Dim dtCustHeader As DataTable = Nothing
          Dim dtCustDetail As DataTable = Nothing
          Dim dtOrders As DataTable = Nothing
          For Each dt As DataTable In ds.Tables
              Dim tblName As String = dt.Columns(0).ColumnName
              Select Case tblName.ToUpper
                  Case "CUSTOMERDETAIL" : dtCustHeader = dt
                  Case "CUSTOMERDETAIL" : dtCustDetail = dt
                  Case "ORDERS" : dtOrders = dt
              End Select
          Next
      

      即使查询返回零行,这些方法也会获取您的表名。

      最后的最佳选择...一种在每次从 SQL 存储过程中自动命名数据集中表的方法(在您的代码的帮助下):

      Dim ds As DataSet = Nothing
      ds = SqlExecute();
      For Each dt As DataTable In ds.Tables
          dt.TableName = dt.Columns(0).ColumnName
      Next
      

      在此之后,您可以在存储过程中使用您控制的名称访问您的表......因为它应该从第一天开始!

      EDIT:选择性实施: 将模式中的第一列命名为“TN:Customer”。 您的旧存储过程正常工作,只会影响您希望修改的存储过程。

                  For Each dt As DataTable In mo_LastDataset.Tables
                      Dim tblName() As String = dt.Columns(0).ColumnName.Split(":")
                      If tblName.Length >= 2 AndAlso tblName(0).ToUpper = "TN" Then
                          dt.TableName = tblName(1)
                      End If
                  Next
      

      ...大卫...

      【讨论】:

      • 我做了一个修改,允许在遗留代码中实现。更改大量存储过程是不切实际的。此方法允许选择性实施。
      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多