Come si può denominare le tabelle del set di dati che si restituiscono in un processo memorizzato?

Ho la seguente stored procedure

Create procedure psfoo () AS select * from tbA select * from tbB 

Sto quindi accedendo ai dati in questo modo:

  Sql Command mySqlCommand = new SqlCommand("psfoo" , DbConnection) DataSet ds = new DataSet(); mySqlCommand.CommandType = CommandType.StoredProcedure; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); mySqlDataAdapter.SelectCommand = mySqlCommand; mySqlDataAdapter.Fill(ds); 

Ora, quando voglio accedere ai miei tavoli, devo farlo:

  DataTable datatableA = ds.Tables[0]; DataTable datatableB = ds.Tables[1]; 

la proprietà Tables del set di dati ha ottenuto anche un accesso per stringa (invece di int).

È ansible quindi specificare il nome delle tabelle nel codice SQL, in modo che io possa invece scrivere questo:

      DataTable datatableA = ds.Tables["NametbA"]; DataTable datatableB = ds.Tables["NametbB"]; 

    Sto usando SQL Server 2008, se questo fa la differenza.

    Per quanto ne so, dal proc memorizzato, non puoi farlo. Tuttavia, è ansible impostare i nomi una volta recuperato il DataSet e quindi utilizzarli da quel momento in poi.

     ds.Tables[0].TableName = "NametbA"; 

    Procedura memorizzata:

      select 'tbA','tbB','tbC' select * from tbA select * from tbB select * from tbC 

    fine frontale:

      int i = 1; foreach (string tablename in dsEmailData.Tables[0].Rows[0][0].ToString().Split(',')) { dsEmailData.Tables[i++].TableName = tablename; } 

    Spero che questo ti aiuti

    C’è qualche ragione per cui non puoi nominarli manualmente dopo aver riempito il DataSet?

     mySqlDataAdapter.Fill(ds); ds.Tables[0].TableName = "NametbA"; ds.Tables[1].TableName = "NametbB"; 

    Non conosco alcun modo per denominare i DataTable che vengono restituiti come parte di più set di risultati da una stored procedure, ma se si conosce il ritorno del processo memorizzato, la loro denominazione manuale dovrebbe funzionare correttamente.

    modificare

    Sapendo di avere il controllo sulla stored procedure, un’alternativa potrebbe essere quella di aggiungere una colonna ai set di risultati che rappresenta il nome della tabella. Quindi potresti essere in grado di fare qualcosa come:

     foreach (DataTable table in ds.Tables) { table.TableName = table.Rows[0]["TableName"].ToString(); } 

    Tuttavia, ciò dipende dai set di risultati che ritornano dalle stored procedure che contengono effettivamente righe. Se non contengono righe, dovresti racchiuderlo in un’istruzione “if” e non tutte le tabelle otterrebbero un nome.

    buona idea, è meglio la tua procedura restituisce tre risultati anziché aggiungere il nome della tabella

     firs trow of each table select 'tbA' FirstTableName,'tbB' SecondTableName select * from tbA select * from tbB 

    ogni volta che si esegue la procedura, le tabelle [0] avranno una riga che continua a continuare a selezionare i nomi delle tabelle

    Un’altra idea può essere passare il nome della tabella come parametro di output della procedura

     Create procedure psfoo (@tb1 varchar(50) output,@tb2 varchar(50) output) AS set @tb1='tbA' set @tb2 'tbB' select * from tbA select * from tbB 

    se questo metodo ti limita e seleziona è variabile puoi creare una procedura come questa

     Create procedure psfoo () AS select * from tbA select * from tbB return 'tbA,tbB' 

    e dividendo la procedura retrun valore in stringa [] è ansible ottenere il nome di tabelle ordinalmente

     [email protected](new char[]{','}); string tablenam1=returnvalue[0]; string tablenam2=returnvalue[1]; 

    Per assegnare nomi a tutte le tabelle in un set di dati, è necessario scrivere un’altra query di selezione all’ultimo SP o T-Sql.

      lsqry = New System.Text.StringBuilder lsqry.AppendLine("select * from Bill_main") lsqry.AppendLine("select * from serviceonly") lsqry.AppendLine("select * from PendingService") lsqry.AppendLine("select * from T_servicebillhd") lsqry.AppendLine("select 'Bill_Main','serviceonly','PendingService','T_servicebillhd'") Using con As New SqlConnection(lsConnection) Try con.Open() Using cmd As SqlCommand = con.CreateCommand With cmd .CommandText = lsqry.ToString .CommandType = CommandType.Text End With Using da As New SqlDataAdapter(cmd) da.Fill(DS) End Using End Using For li As Integer = 0 To DS.Tables.Count - 2 DS.Tables(li).TableName = DS.Tables(DS.Tables.Count - 1).Rows(0).Item(li) Next Catch ex As Exception End Try End Using 

    Nell’esempio sopra, sto usando l’istruzione t-sql invece di SP. In cui ho scritto 4 query di selezione e l’ultimo è il nome di tabella di quelle tabelle. E recuperare l’ultima tabella che contiene i nomi delle tabelle e assegnarla alla tabella utilizzando la proprietà TableName.

    Ho un proc memorizzato che accede a tutti i dati nella mia impresa e restituisce più set di risultati. Ha più senso per me fare una selezione con il nome prima di ogni serie di risultati. Così:

     SELECT 'Customers' AS TableName SELECT ID, Name FROM dbo.Customer SELECT 'Orders' AS TableName SELECT ID, Created FROM dbo.[Order] 

    Quindi, quando eseguo un’iterazione su MyDataSet.Tables, ho solo la logica di ricerca one loop e straight-forward. Non esiste una tabella di metadati principale per tenere il passo. Funziona anche quando non viene restituita alcuna tabella. Se i dati della tabella non vengono restituiti, i metadati corrispondenti non vengono restituiti, il che ha senso per me.

     For Each DataTable As DataTable In MyDataSet.Tables MyDataSet.Tables(MyDataSet.Tables.IndexOf(DataTable) + 1).TableName = DataTable.Rows(0)("TableName") Next 

    Se voglio aggiungere più colonne alle tabelle dei meta-dati, posso farlo.

    So che questo è un post molto vecchio, ma per rispondere … Sì, è ansible. Basta aggiungere il "TableName" nella chiamata Fill del dataadapter ..

     MyDataAdapter.Fill(ds, "TableName"); 

    Sono un ragazzo di C #, ma hai capito il punto.

    So che questa è una vecchia domanda, ma stavo pensando di fare le stesse cose oggi, quindi non stavo semplicemente collegando un indice del set di risultati. Perché se la procedura memorizzata cambia in ordine di selezione del codice .net sarebbe bomba.

    Ho trovato la soluzione per aggiungere una colonna al set di risultati con il nome della tabella e utilizzare un’istruzione case per vedere se la colonna esiste nella tabella. Ma sembrava che stavo spostando il codice. Ho appena creato l’SQL statico. Inoltre, cosa succede se si dispone di una colonna denominata la stessa in una tabella diversa. Noioso…

     myDS.Tables(i).Columns.Contains("TableName") 

    Puoi restituire un set di risultati extra che assegna un nome alle tabelle in questo modo:

     SELECT 'firstTableName' AS tbl UNION SELECT 'secondTableName' AS tbl UNION ... 

    Se quello era il primo set di risultati, è ansible usarlo per denominare i set di risultati successivi man mano che si procede.

    Questo funziona per me, ma ha bisogno di un lavoro aggiuntivo per ottenere i nomi delle tabelle previste:

      Dim tableCount As Integer = 3 Dim tables(tableCount) As DataTable tables(0) = (New DataTable("Employee")) tables(1) = (New DataTable("Manager")) tables(2) = (New DataTable("Department")) dsUControlData.Tables.Add(tables(0)) dsUControlData.Tables.Add(tables(1)) dsUControlData.Tables.Add(tables(2)) 'Fill required tables da.Fill(0, 0, tables) Return dsUControlData 

    Puoi provare questo:

    aggiungi sotto la linea nella tua procedura

     Select 'TableName1','TableName2'; 

    Usando C #:

     for (var i=0;i 

    Prova questo

     YourDataAdapter.Fill(ds, "Table"); 

    Prova questo. In MS SQL 2008 R2, lo uso sempre.

     mySqlDataAdapter.Fill(ds,"NameTableA"); 

    dovrebbe usare select in “yourtablename” da originaltable, questo è solo un esempio, trovare la syntax corretta di select in statement.

    Questo è il modo corretto di farlo per le tue esigenze. Grazie.

    Questa domanda è vecchia ma, è nella parte superiore della ricerca di google, hehe. Forse aiuterà qualcuno …

    E la risposta è sì, è ansible specificare il nome delle tabelle nel codice in modo che sia ansible accedere a DataTable in DataSet con il suo nome.

    Per prima cosa, devo spiegare come funziona TableMapping. Se non specificiamo TableMappings con SqlDataAdapter (SqlDataAdapter che riempirà il nostro DataSet), per impostazione predefinita la prima tabella sarà denominata “Table”, la seconda sarà denominata “Table1”, la terza sarà denominata “Table2” ecc.

    Quindi, quando vogliamo denominare DataTable in DataSet, lo usiamo in questo modo:

     //... System.Data.DataSet myDataSet = new System.Data.DataSet(); using (System.Data.SqlClient.SqlDataAdapter dbAdapter = new System.Data.SqlClient.SqlDataAdapter(dbCommand)) { dbAdapter.TableMappings.Add("Table", "MyFirstTitleForTableOne"); dbAdapter.TableMappings.Add("Table1", "MyFirstTitleForTableTwo"); dbAdapter.TableMappings.Add("Table2", "MyFirstTitleForTableThree"); dbAdapter.TableMappings.Add("Table3", "MyFirstTitleForTableFour"); //... dbAdapter.Fill(myDataSet); } //... 

    E ora possiamo accedere a DataTable dal nostro titolo:

     System.Data.DataTable firstTable = myDataSet.Tables["MyFirstTitleForTableOne"]; System.Data.DataTable secondTable = myDataSet.Tables["MyFirstTitleForTableTwo"]; 

    Ci dispiace, ma non ho scritto codice che verificasse il valore null (myDataSet) o lo impostassi nel blocco try / catch perché ritengo che non sia irrilevante a questa domanda.

    Potrebbe essere questo potrebbe essere il lavoro intorno

      Create procedure psfoo () AS select * ,'tbA' as TableName from tbA select * ,'tbB' as TableName from tbB 

    Quindi nel codice C #

      foreach (DataTable dt in ds.Tables) { if (dt.Rows[0]["TableName"].ToString().Contains("tbA")) { } else if (dt.Rows[0]["TableName"].ToString().Contains("tbB")) { } }