NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!
UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI
Como exibir informações com múltiplas instruções SQL
Ao utilizar múltiplas instruções SQL economizamos os recursos compartilhados da rede e servidor, como largura de banda, memória, CPU, pois reduzimos o número de acessos ao servidor web.
Neste artigo, veremos como retornar registros com uma stored procedure com duas instruções SQL. Inicialmente, declaramos a string de conexão com o banco de dados
string strConexao = "Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind;";
e a stored procedure usada no exemplo:
string sSql = "GetTotalAndProdutos";
Se preferir utilize instruções SQL separadas por ponto-e-vírgula:
string sSql = " SELECT Count(*) AS Total FROM Products; SELECT ProductName, UnitPrice FROM Products";
Com a instrução using criamos uma nova instância da classe SqlConnection e passamos a string de conexão:
using (SqlConnection conn = new SqlConnection(strConexao))
{
Criamos e definimos um objeto SqlDataReader como null.
SqlDataReader r = null;
Em seguida, criamos uma nova instância da classe SqlCommand e passamos ao construtor o objeto SqlConnection e a string com o nome da stored procedure.
SqlCommand cmd = new SqlCommand(sSql, conn);
Definimos a propriedade CommandType como StoredProcedure.
cmd.CommandType = CommandType.StoredProcedure;
Ao usar instruções SQL defina a propriedade CommandType como Text:
cmd.CommandType = CommandType.Text;
Dentro dos blocos try, catch, finally, respectivamente, abrimos e exibimos os dados, manipulamos as exceções que podem ocorrer e fechamos a conexão com o banco de dados.
try
{
conn.Open();
Definimos o objeto SqlDataReader:
r = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Retornamos o índice do campo "total":
int t = r.GetOrdinal("total");
Exibimos a string "Total de registros:".
Response.Write("<b><span style=\"text-decoration: underline\">Total de registros:</span></b> ");
Iniciamos a leitura dos dados
r.Read();
e exibimos o total de registros retornados:
Response.Write(r.GetInt32(t) + "<br/>");
Usamos o método NextResult para exibir os registros do próximo conjunto de registros.
r.NextResult();
Verificamos se há registros para exibir:
if (r.HasRows)
Neste caso especifico, podemos usar também:
if (r.GetInt32(t) > 0)
Em seguida, extraímos o índice do campo ProductName e do campo UnitPrice.
int produto = r.GetOrdinal("ProductName");
int valor = r.GetOrdinal("UnitPrice");
Criamos a tabela onde exibiremos os dados.
Response.Write("<table><tr><td style=\"width: 150px\"><b>Produto</b></td><td style=\"width: 100px\"><b>Valor unitário</b></td></tr>");
Percorremos todos os registros do segundo conjunto de registros.
while (r.Read())
{
Exibimos o nome do produto com o método GetString
Response.Write("<tr><td style=\"width: 150px\">" + r.GetString(produto) + "</td>");
e o valor unitário de cada produto com o método GetDecimal:
Response.Write("<td style=\"width: 100px\">" + string.Format(ci,"{0:c}", r.GetDecimal(valor)) + "</td></tr>");
O método Format da classe String formata a saída como um valor monetário
string.Format(ci,"{0:c}", r.GetDecimal(valor))
e define a cultura como pt-BR - Português Brasil. Desta forma, a saída será sempre em reais, independente do idioma usado pelo computador do usuário.
CultureInfo ci = new CultureInfo("pt-BR");
Ao finalizar o exemplo, exibimos a tag de fechamento da tabela
Response.Write("</table>");
exibimos o bloco catch
catch (SqlException)
{
Response.Write("Erro SQL.");
}
e o bloco finally, onde encerramos a conexão com o banco de dados.
finally
{
if (!r.IsClosed) r.Close();
}
A seguir, temos os arquivos e códigos que compõe este exemplo.
//Arquivo de exemplo: Default.aspx.cs
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strConexao = "Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind;";
string sSql = "GetTotalAndProdutos";
using (SqlConnection conn = new SqlConnection(strConexao))
{
SqlDataReader r = null;
SqlCommand cmd = new SqlCommand(sSql, conn);
cmd.CommandType = CommandType.Text;
try
{
conn.Open();
r = cmd.ExecuteReader(CommandBehavior.CloseConnection);
int t = r.GetOrdinal("total");
Response.Write("<b><span style=\"text-decoration: underline\">Total de registros:</span></b> ");
r.Read();
Response.Write(r.GetInt32(t) + "<br/>");
r.NextResult();
if (r.HasRows)
{
int produto = r.GetOrdinal("ProductName");
int valor = r.GetOrdinal("UnitPrice");
Response.Write("<table><tr><td style=\"width: 150px\"><b>Produto</b></td><td style=\"width: 100px\"><b>Valor unitário</b></td></tr>");
CultureInfo ci = new CultureInfo("pt-BR");
while (r.Read())
{
Response.Write("<tr><td style=\"width: 150px\">" + r.GetString(produto) + "</td>");
Response.Write("<td style=\"width: 100px\">" + string.Format(ci,"{0:c}", r.GetDecimal(valor)) + "</td></tr>");
}
Response.Write("</table>");
}
}
catch (SqlException)
{
Response.Write("Erro SQL.");
}
finally
{
if (!r.IsClosed) r.Close();
}
}
}
}
Temos o arquivo Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head runat="server">
<title>Exemplo com o método NextResult</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
e a stored procedure GetTotalAndProdutos usada no exemplo:
CREATE PROCEDURE GetTotalAndProdutos
AS
SET NOCOUNT ON
SELECT Count(*) AS Total FROM Products
SELECT ProductName, UnitPrice FROM Products
GO
Sobre o autor:
Alfredo Lotar é consultor, programador, escritor. Desenvolve aplicações com ASP.NET, JavaScript, XML, C#, Visual Basic e SQL Server. É autor do livro XML para Programadores ASP, da editora Axcel Books, e dos livros ASP.NET com C# – Curso Prático, e Como programar com ASP.NET e C#, ambos publicados pela Novatec Editora. Atualmente, passa a maior parte do tempo desenvolvendo aplicações, escrevendo livros ou artigos, testando códigos e analisando falhas de segurança em web sites de clientes. O autor pode ser contactado pelo e-mail: alfredo.programador@bol.com.br.
Confira todos os artigos de Windows e Redes:
UNIVERSIDADE DO WINDOWS SERVER E AD |
UNIVERSIDADE PRÁTICA DO WINDOWS SERVER E DO ACTIVE DIRECTORY - Planejamento, Instalação, Configurações, Administração e Segurança no Windows Server: 2019, 2016, 2012 e 2008. |
Acesso Vitalício, Novas Aulas toda Semana, Suporte à Dúvidas e Certificado de Conclusão. |
Para Todos os Detalhes, Acesse:
https://juliobattisti.com.br/windows-server-curso-completo.asp |
Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434
Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208
Todos os direitos reservados, Júlio Battisti 2001-2024 ®
LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO
DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI