2016-04-26 8 views
-2

I den folgenden CodeWebService nur erste Reihe Zurückgeben eines SQL verwendet queryC#

public class dthvendas: System.Web.Services.WebService { 

public class typVenda 
{ 
    //public string campanha; 
    public string id; 
    public string contact_moment; 
    public string nome; 
    // few more properties 
} 

[WebMethod][SoapDocumentMethod] 

public typVenda getListaVendas(string dt_min, string dt_max) 
{ 
    //venda vendas = new List<venda>();  
    typVenda objVenda = new typVenda();  

    SqlConnection con = new SqlConnection(@"Data Source=server;Initial Catalog=database;User ID=user;password=password");    
    //SqlCommand cmd = new SqlCommand("SELECT * FROM dbo where contact_moment >='" + dt_min + "' AND contact_moment <DATEADD(dd, 1, '" + dt_max + "')", con); 
    SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.vcnosadesoes_getlistavendas", con); 

    con.Open();  
    SqlDataReader dr = cmd.ExecuteReader(); 
    if (dr.HasRows) 
    { 
     while (dr.Read()) 
     { 

      //var objVenda = new typVenda(); 
      //objVenda.campanha = dr["id"].ToString(); 

      objVenda.id = dr["id"].ToString(); 
      objVenda.contact_moment = dr["contact_moment"].ToString(); 
      objVenda.nome = dr["nome"].ToString(); 
      objVenda.pacote = dr["pacote"].ToString(); 
      objVenda.telefone = dr["telefone"].ToString(); 
      objVenda.codigo_wc = dr["codigo_wc"].ToString(); 

      //vendas.Add(objVenda); 
     } 
     dr.Close(); 
    } 
    con.Close();       
    return objVenda; 

    //return vendas.ToArray();        
} 

Das Problem ist, dass nur kehrt die erste Zeile, statt alle Zeilen der Tabelle haben. Was könnte das Problem sein, irgendwelche Ideen?

Auch wenn ich zurückkomme, heißt es "Diese XML-Datei scheint keine Stilinformationen zu haben. Der Dokumentbaum ist unten gezeigt." Es sollte einen Header wie diese:

<?xml version="1.0" encoding="UTF‐8" ?> 
+0

Es kann die letzte Reihe sein, ich glaube, –

+3

Nun ja, ist Ihre Methode 'typVenda' zurückzukehren erklärt, die ein einziges Ergebnis. Vielleicht möchten Sie stattdessen 'List ' 'zurückgeben? (An dieser Stelle sollten Sie für jede Iteration der Schleife eine neue Instanz erstellen.) Außerdem sollten Sie 'using'-Anweisungen für Ihre SqlConnection usw. verwenden, alles umbenennen, um den .NET-Namenskonventionen zu folgen, und parametrisiertes SQL verwenden. –

+0

Ihre Frage enthält zu viel unerlaubten Code. Ich habe mir nicht die Mühe gemacht zu lesen, was nicht sofort sichtbar war. –

Antwort

0
public List<typVenda> getListaVendas(string dt_min, string dt_max) 
{ 
    venda vendas = new List<typVenda>();  
    typVenda objVenda = new typVenda();  

    SqlConnection con = new SqlConnection(@"Data Source=server;Initial Catalog=database;User ID=user;password=password");    
    //SqlCommand cmd = new SqlCommand("SELECT * FROM dbo where contact_moment >='" + dt_min + "' AND contact_moment <DATEADD(dd, 1, '" + dt_max + "')", con); 
    SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.vcnosadesoes_getlistavendas", con); 

    con.Open();  
    SqlDataReader dr = cmd.ExecuteReader(); 
    if (dr.HasRows) 
    { 
     while (dr.Read()) 
     { 

      var objVenda = new typVenda(); 
      //objVenda.campanha = dr["id"].ToString(); 

      objVenda.id = dr["id"].ToString(); 
      objVenda.contact_moment = dr["contact_moment"].ToString(); 
      objVenda.nome = dr["nome"].ToString(); 
      objVenda.pacote = dr["pacote"].ToString(); 
      objVenda.telefone = dr["telefone"].ToString(); 
      objVenda.codigo_wc = dr["codigo_wc"].ToString(); 

      vendas.Add(objVenda); 
     } 
     dr.Close(); 
    } 
    con.Close();       

    return vendas; 
} 
2

Wenn Sie n abgerufenen Zeilen in dem Leser, wahrscheinlich werden Sie die letzte Reihe bekommen, da die Eigenschaften gegenüber in jeder Iteration der writted Wares erstellte Objekt while (dr.Read()) und schließlich den letzten Wert an die aufrufende Methode zurückgeben. Sie sollten Ihre Methode neu definieren, um List<typVenda> zurückzugeben, und daher die Liste mit Objekten füllen, die in jeder Iteration erstellt wurden. und schließlich die Liste am Ende der Iteration zurückgeben.

paar Vorschläge für Sie den Code zu verbessern:

  1. Nutzen Sie verwenden, während mit SqlConnection und SqlCommand zu tun; da müssen Sie nicht über die enge Verbindung kümmern und Entsorgen von Befehlen usw. mit wird sich um diese Dinge kümmern
  2. Brauchen Sie nicht zu überprüfen, hat der Leser Zeilen oder nicht (if (dr.HasRows)) while (dr.Read()) wird nicht ausgeführt die beigefügten Anweisungen, wenn es keine sind Reihen.

nun den folgenden Code betrachten:

public List<typVenda> getListaVendas(string dt_min, string dt_max) 
{ 
    List<typVenda> objVendaList = new List<typVenda>(); 

    using (SqlConnection con = new SqlConnection("connection String here")) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.vcnosadesoes_getlistavendas", con)) 
     { 
      con.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 

      while (dr.Read()) 
      { 

       var objVenda = new typVenda(); 

       // Assign the values to the properties here 

       objVendaList.Add(objVenda); 
      } 
      dr.Close(); 
     } 
    } 
    return objVendaList; 
} 
+0

Es funktioniert super danke:). Ist es möglich, dass die Ausgabe eine XML-Zeichenfolge mit dem genannten Header ist? –