我有一个返回多个表的存储过程。用存储过程的表名填充数据集
它填充我的数据集正确,但它命名我的表[Table
,Table1
,Table2
,...]。
有什么我可以添加到数据库层(我的存储过程),将正确命名表?
我有一个返回多个表的存储过程。用存储过程的表名填充数据集
它填充我的数据集正确,但它命名我的表[Table
,Table1
,Table2
,...]。
有什么我可以添加到数据库层(我的存储过程),将正确命名表?
你的SP实际上并没有返回多个表,它从表中返回选定的列和行,因此没有'表名',因此它们被命名为table1,table2等等。如果它很重要,那么你可以为每个选择返回一个额外的列,并在该列中填写所需的名称,然后从那里使用它。
即
select *,'MyTableName1' As [TableName] name from mytablename1
select *,'MyTableName2' As [TableName] name from mytablename2
:
在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
... ...大卫
我已经做了修订,允许执行到遗留代码。改变存储过程的吨数是不现实的。该方法允许选择性实施。 – davidWazy