en el procedimiento almacenado:
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;
en el código 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
un poco tonto (o estúpido) que no se puede nombrar las tablas de un conjunto de resultados. Pero esto lo hace llegar sin un gran número de bytes que repite el nombre de la tabla dentro de cada fila.
Todavía hay sobrecarga pasando el valor NULO de vuelta para cada fila. Tal vez que pasa un valor de bit sería menor aún ...
y una alternativa es utilizar siempre la columna (0): en SQL:
select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail;
en 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
Estos métodos obtienen sus nombres de tablas incluso si la consulta devuelve cero filas.
pero el mejor para el último ...una manera de nombrar realidad las tablas de la base de datos de forma automática, cada vez DE PROCEDIMIENTO almacenados de SQL (con la ayuda de su código):
Dim ds As DataSet = Nothing
ds = SqlExecute();
For Each dt As DataTable In ds.Tables
dt.TableName = dt.Columns(0).ColumnName
Next
Después de esto, se puede acceder a las tablas con el nombre de control dentro del procedimiento almacenado ... como debería haber sido desde el primer día!
EDIT: implementación selectiva: Nombre la primera columna en el patrón "TN: Cliente". Sus procedimientos heredados almacenados funcionan normalmente, solo impactando los procedimientos almacenados que desea modificar.
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
... David ...
No está seguro de lo que están pidiendo aquí. Está seleccionando *, que devolverá todos los a. * Y todos los d. *. Si desea asignar nombres a los campos por separado, puede nombrarlos de forma independiente. – Blazes
¿Cómo/dónde vas a usar este nombre? –
Lo uso en .Net DataTable.tables ["NAME"] –