Usuário com melhor resposta
WebService lendo DataReader em CSharp Asp.Net

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
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,
- Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
-
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++) {
} return produto;
produto.Add(myDataReader.GetName(i), myDataReader.GetValue(i));
}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
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 -
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 -
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.... -
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 -
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.... -
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 -
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,
- Marcado como Resposta LuizIta quarta-feira, 21 de julho de 2010 00:19
-
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++) {
} return produto;
produto.Add(myDataReader.GetName(i), myDataReader.GetValue(i));
}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
-
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 -
-
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 -
-