4

我有一个返回多个表的存储过程。用存储过程的表名填充数据集

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

有什么我可以添加到数据库层(我的存储过程),将正确命名表?

回答

3

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

select *,'MyTableName1' As [TableName] name from mytablename1 
    select *,'MyTableName2' As [TableName] name from mytablename2 
0
在存储过程

在Vb.Net代码
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; 

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值传回给每一行。或许传递位值会更小但...

而且还有一个办法是经常使用的列(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 

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

但最后的最好...的方式来实际自动命名的DataSet中的表,每次从SQL存储过程(从您的代码的帮助):

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

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

编辑:选择性实现: 在模式“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 

... ...大卫

+0

我已经做了修订,允许执行到遗留代码。改变存储过程的吨数是不现实的。该方法允许选择性实施。 – davidWazy

相关问题