none
WebService lendo DataReader em CSharp Asp.Net RRS feed

  • Pergunta

  • Olá pessoal, confesso que procurei no google e em toda net e não achei nenhum artigo, link ou exemplo de codigo de como ler campos data reader de um banco de dados via webservice, chamando-os atraves de um dado de pesquisa e os consumindo

    Alguem teria um HELP DE AJUDA ai, ou link ou artigo ou codigo de exemplo que demonstre isto

    Fico no aguardo e desde já agradeço


    LADEF
    sábado, 17 de julho de 2010 16:20

Respostas

  • Hi,

    Amigo, faz o seguinte. cria o WebServie

    http://pplware.sapo.pt/tutoriais/tutorial-c-webservices/

    ai voce ajusta o WebService  assim

    public Dictionary<string,string> GetData(string Categoria)
    {
     myCommand = new SqlCommand("MyProcedureProdutos", myConnection);
     myCommand.CommandType = CommandType.StoredProcedure;
    
     SqlParameter parameterPage = new SqlParameter("@Category", SqlDbType.VarChar, 20);
     parameterPage.Value = Categoria;
     myCommand.Parameters.Add(parameterPage);
    
     myConnection.Open();
     myDataReader = myCommand.ExecuteReader();
    
     Dictionary<string, string> produto = new Dictionary<string, string>();
    if (myDataReader.Read()) { produto.Add("ID", "hplProduto"); produto.Add("Height" ,myDataReader["Height"].ToString()); produto.Add("Width" ,myDataReader["Width"].ToString()); produto.Add("Prod_Id" ,myDataReader["Prod_Id"].ToString()); produto.Add("ImageUrl" ,myDataReader["ImgProduto"].ToString()); produto.Add("TextProduto" ,myDataReader["TextProduto"].ToString()); produto.Add("BorderStyle" ,BorderStyle.None); } return produto; }

    Ai no seu metodo que voce colocou acima voce faz a chamada do seu webservice.

    using(MyWebService mService = new SeuWebService())
    {
     Dictionary<string, string> peoduto = mService.GetData(Categoria);
     hplProduto.ID = produto["ID"];
     hplProduto.Height = Unit.Parse(produto["Height"]);
     hplBanner.Width = Unit.Parse(produto["Width"]);
     hplProduto.NavigateUrl = (meudominio+"/detalhesproduto.aspx?Prod_Id=" + produto["Prod_Id"].ToString());
     
     hplProduto.ImageUrl = produto["ImgProduto"];
     hplProduto.ToolTip = produto["TextProduto"];
     hplBanner.BorderStyle = BorderStyle.None;
    
     this.Controls.Add(hplProduto);
     this.ChildControlsCreated = true;
    
    }

    Att,


    Tech-ed 2010
    • Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
    terça-feira, 20 de julho de 2010 22:23
    Moderador
  • ao inves de :

     

     

     Dictionary<string, object> produto = new Dictionary<string, object>();
    if (myDataReader.Read()) { produto.Add("ID", "hplProduto"); produto.Add("Height" ,myDataReader["Height"].ToString()); produto.Add("Width" ,myDataReader["Width"].ToString()); produto.Add("Prod_Id" ,myDataReader["Prod_Id"].ToString()); produto.Add("ImageUrl" ,myDataReader["ImgProduto"].ToString()); produto.Add("TextProduto" ,myDataReader["TextProduto"].ToString()); produto.Add("BorderStyle" ,BorderStyle.None); } return produto; }

     

     

    faça:

     

     Dictionary<string, string> produto = new Dictionary<string, string>();
    if (myDataReader.Read()) {
       for (int i = 0; i < myDataReader.FieldCount; i++) {
    produto.Add(myDataReader.GetName(i), myDataReader.GetValue(i));
    }
    } return produto;

     

     


    para não ter problemas depois com a alteração/inclusao/exclusao de campos na procedure depois
    

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    • Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
    terça-feira, 20 de julho de 2010 23:02
    Moderador

Todas as Respostas

  • Hi,

    Amigo, voce nao pode passar um DataReader por webservice tem de ser um objeto serializavel.

    Att,


    Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br

    R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    segunda-feira, 19 de julho de 2010 23:11
    Moderador
  • E como seria essa substituição do DataReader pelo Serializavel e como poderia consumir os campos deste webservice em uma classe de banco de dados para depois consumir na aplicação asp.net

    Você teria um link, artigo ou codigo de exemplo

    Fico no aguardo e desde já agradeço

     


    LADEF
    segunda-feira, 19 de julho de 2010 23:58
  • Se eu entendi vc quer um WebMethod que retornar linha por linha do seu datareader...

    Se for em SQL Server 2005 ou superior.. vc pode filtrar pelo ROW_NUMBER() os resultados...

    Seguem 2 exemplos... o primeir é se vc puder usar sessions no seu WS o outro vc faz o controle da linha manualmente no aplicativo client:

     

     [WebMethod(EnableSession=true)]
        public Dictionary<string, object> Read() {
          if (!(Session["rowid"] is int)) Session["rowid"] = 0;      
          using (var connection = new SqlConnection()) {
            var command = connection.CreateCommand();
            command.CommandText = "Select * from Tabela where ROW_NUMBER() = @ROWID";
            command.Parameters.AddWithValue("@ROWID", Session["rowid"]);
            var reader = command.ExecuteReader();
            if (reader.Read()) {
              var result = new Dictionary<string, object>();
              for (int i = 0; i < reader.FieldCount; i++) {
                result.Add(reader.GetName(i), reader.GetValue(i));
              }
              Session["rowid"] = (int)Session["rowid"] + 1;
              return result;
            } else {
              Session["rowid"] = null;
              return null;
            }        
          }      
        }
    
        [WebMethod]
        public Dictionary<string, object> Read(int rowid) {
          using (var connection = new SqlConnection()) {
            var command = connection.CreateCommand();
            command.CommandText = "Select * from Tabela where ROW_NUMBER() = @ROWID";
            command.Parameters.AddWithValue("@ROWID", rowid);
            var reader = command.ExecuteReader();
            if (reader.Read()) {
              var result = new Dictionary<string, object>();
              for (int i = 0; i < reader.FieldCount; i++) {
                result.Add(reader.GetName(i), reader.GetValue(i));
              }
              return result;
            } else {
              return null;
            }
          }
        }
    


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    terça-feira, 20 de julho de 2010 02:03
    Moderador
  • Olá Rui Bom dia, e baseado no segundo reader como associo a leitura dos campos de minha base que estão em colunas, linhas

    tipo linharegistro - campocolum1,campocolum2,campocolum3, etc. eu tendo que ler e repassar para a classe consumidora do webservice ou até diretamente no webcontrol principalmente para o segundo

    no caso da descrição acima é melhor á ser usado o primeiro exemplo e como eu consumiria o mesmo numa classe ou webcontrol principalmente para o segundo, tipo como repasso os dados deste webmethod para os dados da classe ou webcontrol

     

    Fico no aguardo e desde já agradeço

     


    LADEF
    terça-feira, 20 de julho de 2010 04:50
  • Ola... bem se vc puder trazer todos os registros de uma consulta de uma so ver... aconselho vc a usar um DataTable:

    http://www.devmedia.com.br/post-17498-Usando-DataSet-Tipado-com-ASP-NET.html

    O caso q eu mostrei serve se vc quiser carregar linha a linha... dessa forma não existe um processo automatizado... seria mais ou menos assim:

    using (var service = new SeuWebService()) {
        Dictionary<string, object> linha = null;
        while ((linha = service.Read()) != null) {
              Console.WriteLine("Campo1 = " + linha["Campo1"].ToString());
              Console.WriteLine("Campo2 = " + linha["Campo2"].ToString());
              Console.WriteLine();
        }   
    }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    terça-feira, 20 de julho de 2010 14:46
    Moderador
  • Rui o que eu precisaria seria mais ou menos como o abaixo, para vc ter uma ideia

    myCommand = new SqlCommand("MyProcedureProdutos", myConnection);
              myCommand.CommandType = CommandType.StoredProcedure;
    
              SqlParameter parameterPage = new SqlParameter("@Category", SqlDbType.VarChar, 20);
              parameterPage.Value = Categoria;
              myCommand.Parameters.Add(parameterPage);
    
              myConnection.Open();
              myDataReader = myCommand.ExecuteReader();
    
              if (myDataReader.Read()) 
              {
                
                
                
    
                  hplProduto.ID = "hplProduto";
                  hplProduto.Height = Unit.Parse(myDataReader["Height"].ToString());
                  hplBanner.Width = Unit.Parse(myDataReader["Width"].ToString());
                  hplProduto.NavigateUrl = (meudominio+"/detalhesproduto.aspx?Prod_Id=" + myDataReader["Prod_Id"].ToString());
                  
                  hplProduto.ImageUrl = myDataReader["ImgProduto"].ToString();
                  hplProduto.ToolTip = myDataReader["TextProduto"].ToString();
                  hplBanner.BorderStyle = BorderStyle.None;
    
    
    
    
    
    
                  //adicionar os controles a coleçao de child controls do Web Custom Control
    
                  this.Controls.Add(hplProduto);
                  this.ChildControlsCreated = true;
                }
    
    

     

    Só que A)Primeiro eu precisaria Criar um WebService para Carregar o DataReader ou  o que vcs me orientarem pelo codigo acima, onde o parametro solicitado para fz a consulta seria a Categoria do Produto

     

    B)eu precisaria saber como ai sim com os campos eu poderia repassar para o webcontrol do codigo acima vindo do webservice que recupera o datareader os mesmos campos para que o meu webcontrol os reconhece-se

     

    Fico no aguardo então, agora que lhes passei um exemplo do que preciso, qual seria a arquitetura melhor e como eu adapto o consumo deste webservice com os campos no webcontrol acima

    Fico no aguardo e desde já agradeço


    LADEF
    terça-feira, 20 de julho de 2010 17:46
  • Hi,

    Amigo, faz o seguinte. cria o WebServie

    http://pplware.sapo.pt/tutoriais/tutorial-c-webservices/

    ai voce ajusta o WebService  assim

    public Dictionary<string,string> GetData(string Categoria)
    {
     myCommand = new SqlCommand("MyProcedureProdutos", myConnection);
     myCommand.CommandType = CommandType.StoredProcedure;
    
     SqlParameter parameterPage = new SqlParameter("@Category", SqlDbType.VarChar, 20);
     parameterPage.Value = Categoria;
     myCommand.Parameters.Add(parameterPage);
    
     myConnection.Open();
     myDataReader = myCommand.ExecuteReader();
    
     Dictionary<string, string> produto = new Dictionary<string, string>();
    if (myDataReader.Read()) { produto.Add("ID", "hplProduto"); produto.Add("Height" ,myDataReader["Height"].ToString()); produto.Add("Width" ,myDataReader["Width"].ToString()); produto.Add("Prod_Id" ,myDataReader["Prod_Id"].ToString()); produto.Add("ImageUrl" ,myDataReader["ImgProduto"].ToString()); produto.Add("TextProduto" ,myDataReader["TextProduto"].ToString()); produto.Add("BorderStyle" ,BorderStyle.None); } return produto; }

    Ai no seu metodo que voce colocou acima voce faz a chamada do seu webservice.

    using(MyWebService mService = new SeuWebService())
    {
     Dictionary<string, string> peoduto = mService.GetData(Categoria);
     hplProduto.ID = produto["ID"];
     hplProduto.Height = Unit.Parse(produto["Height"]);
     hplBanner.Width = Unit.Parse(produto["Width"]);
     hplProduto.NavigateUrl = (meudominio+"/detalhesproduto.aspx?Prod_Id=" + produto["Prod_Id"].ToString());
     
     hplProduto.ImageUrl = produto["ImgProduto"];
     hplProduto.ToolTip = produto["TextProduto"];
     hplBanner.BorderStyle = BorderStyle.None;
    
     this.Controls.Add(hplProduto);
     this.ChildControlsCreated = true;
    
    }

    Att,


    Tech-ed 2010
    • Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
    terça-feira, 20 de julho de 2010 22:23
    Moderador
  • ao inves de :

     

     

     Dictionary<string, object> produto = new Dictionary<string, object>();
    if (myDataReader.Read()) { produto.Add("ID", "hplProduto"); produto.Add("Height" ,myDataReader["Height"].ToString()); produto.Add("Width" ,myDataReader["Width"].ToString()); produto.Add("Prod_Id" ,myDataReader["Prod_Id"].ToString()); produto.Add("ImageUrl" ,myDataReader["ImgProduto"].ToString()); produto.Add("TextProduto" ,myDataReader["TextProduto"].ToString()); produto.Add("BorderStyle" ,BorderStyle.None); } return produto; }

     

     

    faça:

     

     Dictionary<string, string> produto = new Dictionary<string, string>();
    if (myDataReader.Read()) {
       for (int i = 0; i < myDataReader.FieldCount; i++) {
    produto.Add(myDataReader.GetName(i), myDataReader.GetValue(i));
    }
    } return produto;

     

     


    para não ter problemas depois com a alteração/inclusao/exclusao de campos na procedure depois
    

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    • Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
    terça-feira, 20 de julho de 2010 23:02
    Moderador
  • Ok assim que testar já marco-os como resposta correta

    Mas então no meu webcontrol não preciso mais usar

    myCommand = new SqlCommand("MyProcedureProdutos", myConnection);
       myCommand.CommandType = CommandType.StoredProcedure;
    
       SqlParameter parameterPage = new SqlParameter("@Category", SqlDbType.VarChar, 20);
       parameterPage.Value = Categoria;
       myCommand.Parameters.Add(parameterPage);
    
       myConnection.Open();
       myDataReader = myCommand.ExecuteReader();
    
       if (myDataReader.Read()) 
       {
       
       
       
    
        hplProduto.ID = "hplProduto";
        hplProduto.Height = Unit.Parse(myDataReader["Height"].ToString());
        hplBanner.Width = Unit.Parse(myDataReader["Width"].ToString());
        hplProduto.NavigateUrl = (meudominio+"/detalhesproduto.aspx?Prod_Id=" + myDataReader["Prod_Id"].ToString());
        
        hplProduto.ImageUrl = myDataReader["ImgProduto"].ToString();
        hplProduto.ToolTip = myDataReader["TextProduto"].ToString();
        hplBanner.BorderStyle = BorderStyle.None;
    
    
    
    
    
    
        //adicionar os controles a coleçao de child controls do Web Custom Control
    
        this.Controls.Add(hplProduto);
        this.ChildControlsCreated = true;
       }
    
    

    dentro do CreateChildControls como o Adriel  colocou apenas no WebControl coloco

    using(MyWebService mService = new SeuWebService())
    {
     Dictionary<string, string> peoduto = mService.GetData(Categoria);
     hplProduto.ID = produto["ID"];
     hplProduto.Height = Unit.Parse(produto["Height"]);
     hplBanner.Width = Unit.Parse(produto["Width"]);
     hplProduto.NavigateUrl = (meudominio+"/detalhesproduto.aspx?Prod_Id=" + produto["Prod_Id"].ToString());
     
     hplProduto.ImageUrl = produto["ImgProduto"];
     hplProduto.ToolTip = produto["TextProduto"];
     hplBanner.BorderStyle = BorderStyle.None;
    
     this.Controls.Add(hplProduto);
     this.ChildControlsCreated = true;
    }
    

    isto

    e aproveitando Rui porque é melhor colocar deste jeito para o caso de alteração, inclusão e exclusão

     
    
     Dictionary<string, string> produto = new Dictionary<string, string>();
     if (myDataReader.Read()) 
     { for (int i = 0; i < myDataReader.FieldCount; i++) { produto.Add(myDataReader.GetName(i), myDataReader.GetValue(i)); } } return produto;
    

    colocando deste jeito no WebService não vai influir na consumação do WebControl da forma acima que o Adriel colocou

    Ah e aproveitando dentro do meu WebService pode sêr acrescentado um web.config para dentro do meu webservice não mostrar a string de conexão da base de dados?

     

    Fico no aguardo e desde já agradeço

     

     

     


    LADEF
    terça-feira, 20 de julho de 2010 23:55
  • Hi,

    nao influi nao, o rui esta certo.

    desse jeito e melhor porque por exemplo caso sela alterado o nome de uma das colunas na base de dados o codigo nao fica invalido precisando ser alterado.

    Att,


    Tech-ed 2010
    quarta-feira, 21 de julho de 2010 00:12
    Moderador
  • Ok Adriel e Rui ses tão me ajudando muito nesta e só para completar a questão no WebService posso acrescentar um Web.Config ao WebService para que o WebMethod da Connection ou Classe da Connection do WebService peque a ConnectionString que esteja neste Web.Config do WebService, inclusive a mesma estando cryptografada por questão de proteção ou não?

    Fico no aguardo e desde já agradeço


    LADEF
    quarta-feira, 21 de julho de 2010 00:16
  • Sem problemas... pode usar o Settings tmb da mesma forma
    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quarta-feira, 21 de julho de 2010 00:17
    Moderador
  • pk Rui e Adriel obrigadão pelas respostas lembrando que estou usando o VS2008 e Framework 3.5

     


    LADEF
    quarta-feira, 21 de julho de 2010 00:18