2013-08-29 14 views
9

mam przekonwertować system ASP klasyczne do C#zwracać wiele zestawów rekordów z przechowywanych proc w C#

Mam procedurę przechowywaną, która może powrócić do 7 zestawów rekordów (w zależności od parametrów przekazywanych w).

Potrzebuję wiedzieć, w jaki sposób mogę po prostu zwrócić wszystkie zestawy rekordów jako indywidualne DataTables, dzięki czemu mogę przechodzić przez to, co tam jest, przeskakując do następnej tabeli DataTable, gdy dojdę do jej końca bez konieczności uruchamiania wielu instrukcji SQL i użyj wielu adapterów. Wypełnij instrukcje, aby dodać każdą tabelę do zestawu danych.

W wersji klasycznej była to prosta pętla Do While not objRS.EOF z obiektem objRS.NextRecordset(), gdy dotarłem do końca pętli, aby przejść do następnej instrukcji.

Czy mogę użyć czegoś, co nie wymaga całkowitego przepisania bieżącego kodu zwrotnego?

Każdy zestaw rekordów ma inną liczbę kolumn i wierszy. Nie są ze sobą powiązane. Zwracamy wiele zestawów rekordów ze Stored Proc w celu zmniejszenia ruchu.

Przykłady byłyby miłe.

Dzięki

Odpowiedz

11
SqlConnection con=new SqlConnection("YourConnection String"); 
SqlCommand cmd=new SqlCommand(); 
SqlDataAdapter da=new SqlDataAdapter(); 
DataSet ds = new DataSet(); 
cmd = new SqlCommand("name of your Stored Procedure", con); 
cmd.CommandType = CommandType.StoredProcedure; 
//cmd.Parameters.AddWithValue("@SuperID", id);//if you have parameters. 
da = new SqlDataAdapter(cmd); 
da.Fill(ds); 
con.Close(); 

Po tym można wziąć reklamę vantage różnych (7) zestawów rekordów przy użyciu

ds.Tables[0] 
ds.Tables[1] 
ds.Tables[2] 
ds.Tables[3] 
ds.Tables[4] 
ds.Tables[5] 
ds.Tables[6] 
+0

Dziękuję, podoba mi się ta odpowiedź wyłącznie dlatego, że mam już klasę danych z funkcjami otoki, które obsługują połączenia i usuwają je, gdy klasa jest zniszczona itp. Chciałem tylko użyć istniejącej funkcji, która Miałem i odwoływać się do tabel w zestawie danych. – user2334626

5

to, że wszystko, czego potrzeba

using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString)) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.CommandText = "yoursp"; 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 

     conn.Open(); 

     SqlDataAdapter adapter = new SqlDataAdapter(cmd); 

     DataSet ds = new DataSet(); 
     adapter.Fill(ds); 

     conn.Close(); 
    } 
} 
+2

To jest to, czego używam, aby uzyskać wiele zestawów rekordów z procedura składowana. Dla wyjaśnienia, zestawy rekordów są przechowywane w 'ds.Tabelach' i możesz chcieć umieścić' DataSet ds = new DataSet(); 'na początku tak, abyś mógł odwoływać się do niego poza' using (SqlConnection conn = new System.Data.SqlClient.SqlConnection (connString)) 'block. Tylko myśl. – JoeFletch

+0

tak, możesz to przenieść. tylko dając przykład, jak to zrobić ;. – Ehsan

8

Jeśli wypełnić DataSet przy użyciu metody SqlDataAdapter.Fill() następnie każdego z zestawów rekordów zwracanych przez procedury przechowywanej zostanie zwrócony jako DataTable ramach zwrotu Zbiór danych

DataSet dataset = new DataSet(); 
using (var adapter = new SqlDataAdapter("yourStoredProcedure", yourConnectionString)) 
{ 
    adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
    adapter.Fill(dataset); 
} 
for (int i = 0; i < dataset.Tables.Count; i++) 
{ 
    // Do something for each recordset 
} 

Jeśli używasz SqlDataReader następnie można użyć użyć metody SqlDataReader.NextResult() do góry do następnej rekordów:

using (var connection = new SqlConnection(yourConnectionString)) 
using (var command = new SqlCommand("yourStoredProcedure")) 
{ 
    connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // do something with first result set; 
     } 
     if (reader.NextResult()) 
     { 
      while (reader.Read()) 
      { 
       // do something with second result set; 
      } 
     } 
     else 
     { 
      return; 
     } 
     if (reader.NextResult()) 
     { 
      while (reader.Read()) 
      { 
       // do something with third result set; 
      } 
     } 
     else 
     { 
      return; 
     } 
    } 
} 
+0

Nigdy nie wiedziałem, że można uzyskać wiele zestaw wyników z 'SqlDataReader' z' .ExecuteReader() 'i' .NextResult() '. Dzięki za szczegółową odpowiedź! – JoeFletch

+2

Rzeczywiście można, ja ogólnie wolę pracować z SqlDataReader ze względu na mniejsze użycie pamięci tylko poprzez przechowywanie bieżącego rekordu i nie zawracam sobie głowy tym, co już przeczytałem, a co jeszcze nie jest czytane. Jednak istnieje odpowiednia analogia w [tej odpowiedzi] (http://stackoverflow.com/a/1083223/1048425) porównującej zestawy danych z datareadżerami. – GarethD

+0

Dzięki za udostępnienie linku SO! Użyłem 'SqlDataReader's w przeszłości i myślałem, że było dużo kodu do utrzymania. Następnie wypróbowałem 'DataTables' i pomyślałem, że są one znacznie szybsze. Będę musiał pamiętać o alternatywach, pisząc dodatkowy kod w przyszłości! Jeszcze raz dziękuję za udostępnienie! – JoeFletch

0

można sprawdzić, czy dr ma więcej rekordów ot nie używając if (dr.NextResult())

a następnie pętli ponownie dr.read

spróbować tej

string connStr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString; 
SqlConnection Con = new SqlConnection(connStr); 

try 
{ 
    string str1 = "select productid,productname from products;select VendorFName from vendor"; 
    SqlCommand com = new SqlCommand(str1, Con); 

    com.Connection.Open(); 

    SqlDataReader dr = com.ExecuteReader(); 

    DropDownList1.Items.Add("Select Product Id"); 
    DropDownList2.Items.Add("Select Vendor Name"); 

    while(dr.Read()) 
    { 
     DropDownList1.Items.Add(dr.GetValue(0).ToString()); 
    } 

    if (dr.NextResult()) 
    { 
     while (dr.Read()) 
     { 
      DropDownList2.Items.Add(dr.GetValue(0).ToString()); 
     } 
    } 
} 
catch (Exception ex) 
{ 
} 
finally 
{ 
    if (Con.State == ConnectionState.Open) 
    { 
     Con.Close(); 
    } 
} 
Powiązane problemy