2016-12-21 5 views
0

Ich bekomme, dass wir using verwenden können, um mehrere Befehle in einem sqlconnection zu haben.Mehrere sqlcommands zurückgeben

So:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 
    using (SqlCommand command1 = new SqlCommand(commandText1, connection)) 
    { 
    } 
    using (SqlCommand command2 = new SqlCommand(commandText2, connection)) 
    { 
    } 
    // etc 
} 

Was aber, wenn die using in einem Verfahren, das einen Leser Besetzung zurückkehrt?

So:

public IEnumerable<LocationInfo> GetData() 
{   
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString)) 
    { 
     //connection.Close(); 
     connection.Open(); 
     using (SqlCommand command = new SqlCommand(@"SELECT .... ", connection)) 
     {   
      command.Notification = null; 
      SqlDependency dependency = new SqlDependency(command); 
      dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

      if (connection.State == ConnectionState.Closed) 
      { connection.Open(); } 
      using (var reader = command.ExecuteReader()) 
      { 
       return reader.Cast<IDataRecord>().Select(x => new LocationInfo()       
       { 
        Names = x.GetString(2), 
        Values = Math.Round(x.GetDouble(7), 2).ToString("#,##0.00"), 
        ValuesDouble = x.GetDouble(7), 
        Values2 = Math.Round(x.GetDecimal(9), 2).ToString("#,##0.00"), 
        ValuesDouble2 = x.GetDecimal(9), 
        truckDelivery=x.GetDecimal(3), 
        truckIdle = x.GetDecimal(4), 
        truckRepair = x.GetDecimal(5), 
        truckReady = x.GetDecimal(6), 
        presentEmp=x.GetInt32(11), 
        absentEmp = x.GetInt32(12), 
        ondutyEmp = x.GetInt32(13), 
       }).ToList(); 
      } 
      /* I tried this but it just got ignored 
      using (var reader2 = command.ExecuteReader()) 
      { 
       reader2.NextResult(); 
       return reader2.Cast<IDataRecord>().Select(x => new LocationInfo() 
       { 
        SumVol = x.GetString(0)  
       }).ToList(); 
      }*/ 
     } 
    } 
} 

Helfen Sie mir bitte. Meine zweite using wird immer ignoriert und nicht davon ausgehen, dass ich etwas weiß, weil ich neu bin. Vielen Dank im Voraus.

+1

Sie verpassen den Aufruf von reader.Read(). Es ist nicht klar, ob dieser Code gerade Datensätze oder eine Reihe von Datensätzen abruft. Im letzteren Fall benötigen Sie eine Schleife. – Steve

+1

Zusätzlich zu dem, was Steve vorgeschlagen hat, wird das zweite 'using' ignoriert, da es im ersten' using' Block eine 'return' gibt, vielleicht ist dies der Grund, aus dem das Objekt zurückkommt der erste 'using'-Block und der darunter liegende Code wird ignoriert. – Aamir

+0

Es macht eine Schleife, um Daten aus der Datenbank zu retreive, und auch in der Werte-Controller wie folgt verwendet: public class ValuesController: ApiController { LocationInfoRepository objRepo = new LocationInfoRepository(); // GET api/values ​​ öffentlich IEnumerable Get() { return objRepo.GetData(); } } Ich weiß, die Ursache der zweiten Verwendung von Ignoranz ist wegen der Return-Anweisung, wie muss ich es ändern, damit ich es beheben kann. Vielen Dank für Ihre Hilfe @Steve – MVCNoob

Antwort

0

Sie müssen den Datensatz lesen, auf den der von ExecuteReader erhaltene SqlDataReader zeigt. Akkumulieren Sie Ihre LocationInfo in einer Liste, und geben Sie sie zurück, wenn Sie die Schleife über den Reader beendet haben.

public IEnumerable<LocationInfo> GetData() 
{ 
    List<LocationInfo> locations = new List<LocationInfo>(); 
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString)) 
    using (SqlCommand command = new SqlCommand(@"SELECT .... ", connection)) 
    { 
     connection.Open(); 
     using (var reader = command.ExecuteReader()) 
     { 
      while(reader.Read()) 
      { 
       LocationInfo x = new LocationInfo() 
       { 
        Names = x.GetString(2), 
        Values = Math.Round(x.GetDouble(7), 2).ToString("#,##0.00"), 
        ValuesDouble = x.GetDouble(7), 
        Values2 = Math.Round(x.GetDecimal(9), 2).ToString("#,##0.00"), 
        ValuesDouble2 = x.GetDecimal(9), 
        truckDelivery=x.GetDecimal(3), 
        truckIdle = x.GetDecimal(4), 
        truckRepair = x.GetDecimal(5), 
        truckReady = x.GetDecimal(6), 
        presentEmp=x.GetInt32(11), 
        absentEmp = x.GetInt32(12), 
        ondutyEmp = x.GetInt32(13), 
       }; 
       locations.Add(x); 
      } 
     } 
    } 
    return locations; 

} 
0

OK also hier ist, was Sie in Ihrer Situation tun können, um Ergebnisse von zwei Ergebnismengen zu einem Objekt zusammenzuführen.

public IEnumerable<LocationInfo> GetData() 
{ 
     List<LocationInfo> locations = new List<LocationInfo>(); 
     using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString)) 
     using (SqlCommand command = new SqlCommand(@"SELECT .... ", connection)) 
     { 
      connection.Open(); 

      using (var reader = command.ExecuteReader()) 
      { 
       LocationInfo x = new LocationInfo(); 
       while(reader.Read()) 
       { 

        { 
         x.Names = reader.GetString(2), 
         x.Values=Math.Round(reader.GetDouble(7),2).ToString("#,##0.00"), 
         x.ValuesDouble = reader.GetDouble(7), 
         Values2 = Math.Round(reader.GetDecimal(9), 2).ToString("#,##0.00"), 
         x.ValuesDouble2 = reader.GetDecimal(9), 
         x.truckDelivery=reader.GetDecimal(3), 
         x.truckIdle = reader.GetDecimal(4), 
         x.truckRepair = reader.GetDecimal(5), 
         x.truckReady = reader.GetDecimal(6), 
         x.presentEmp=reader.GetInt32(11), 
         x.absentEmp = reader.GetInt32(12), 
         x.ondutyEmp = reader.GetInt32(13), 
        }; 

       } 
       if(reader.NextResult()) 
       { 
       while (reader.Read()) 
       { 
        x.SumVol=reader.GetString(0); 
       } 
       } 
       locations.Add(x); 
      } 
     } 
     return locations; 
} 
Verwandte Themen