2009-06-17 3 views
1

ich durch das Sammeln von Daten aus mehreren Tabellen meiner Business-Objekte of this schicken, zum BeispielMARS vs Nextresult

 
SELECT * FROM CaDataTable; 
SELECT * FROM NyDataTable; 
SELECT * FROM WaDataTable; 

und so weiter ... (C# 3.5, SQL Server 2005)

Ich habe mit worden Chargen:

01:

void BatchReader() 
    { 
     string sql = "Select * From CaDataTable" + 
        "Select * From NyDataTable" + 
        "Select * From WaDataTable"; 

     string connectionString = GetConnectionString(); 
     using (SqlConnection conn = new SqlConnection(connectionString)) { 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand(sql, conn); 
      using (SqlDataReader reader = cmd.ExecuteReader()) { 
       do { 
        while (reader.Read()) { 
         ReadRecords(reader); 
        } 
       } while (reader.NextResult()); 
      } 
     } 
    } 

ich auch mehrere Befehle gegen die gleiche Verbindung verwendet haben

Ist eine dieser Techniken deutlich besser als die andere? Würde es auch einen Gewinn geben, wenn ich MARS für die zweite Methode verwende? Mit anderen Worten, ist es so einfach, MultipleActiveResultSets = True in der Verbindungszeichenfolge zu setzen und einen großen Vorteil zu erzielen?

Antwort

2

Wenn die Datenstruktur die gleiche in jeder Tabelle ist, würde ich tun:

Select *, 'Ca' Source From CaDataTable 
union all 
Select *, 'Ny' Source From NyDataTable 
union all 
Select *, 'Wa' Source From WaDataTable 
+0

Danke, das ist eine großartige Alternative. Gibt es eine Möglichkeit, dies zu programmieren, wenn ich nicht sicher bin, dass jede der Tabellen existiert? Mit anderen Worten, wie kann man sich gegen die Situation verteidigen, in der NyDataTable nicht existiert? – Sisiutl

+1

Ich würde die obige Abfrage dynamisch basierend auf Informationen erstellen, die erhalten werden von: select * from information_schema.tables – RedFilter

0

ohne tatsächlich die beiden Versionen gegeneinander Timing, können Sie nur spekulieren ....

Ich hoffe, wetten Sie, dass Version 1 (BatchReader) schneller ist, da Sie nur einen Hin- und Rückweg zur Datenbank haben. Version 2 erfordert drei verschiedene Roundtrips - je einen für jede von Ihnen ausgeführte Abfrage.

Aber nochmal: Sie können nur wirklich sagen, wenn Sie messen.

Marc

Oh, PS: natürlich in einem realen Szenario auch die Spalten zurückgeführt, so begrenzen würde helfen, z.B. Verwenden Sie nicht SELECT *, sondern verwenden Sie stattdessen SELECT (list of fields) und halten Sie diese Liste der Felder so kurz wie möglich.

Verwandte Themen