Sql Server: Converter números para extenso (Atualizado)

2

Category : Desenvolvimento, Destaque, SQL Server

Converte números para extenso entre 0 e 999999999.99.

O código abaixo retorna o número por extenso no formato Real (R$). Para usar outros tipos, é só mudar o texto na última FUNCTION [dbo].[NExtenso].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
CREATE FUNCTION [dbo].[NExtenso_Extenso](@Num INTEGER)
	RETURNS VARCHAR(50)
AS
BEGIN 
	-- Por Ycaro Afonso 03/12/2011
	-- V 0.1
	RETURN CASE @Num 
		WHEN 1000 THEN 'Mil' WHEN 1000000 THEN 'Milhões' WHEN 1000000000 THEN 'Bilhões'
		WHEN 100 THEN 'Cento' WHEN 200 THEN 'Duzentos' WHEN 300 THEN 'Trezentos' WHEN 400 THEN 'Quatrocentos' WHEN 500 THEN 'Quinhentos' WHEN 600 THEN 'Seiscentos' WHEN 700 THEN 'Setecentos' WHEN 800 THEN 'Oitocentos' WHEN 900 THEN 'Novecentos'
		WHEN 10 THEN 'Dez' WHEN 11 THEN 'Onze' WHEN 12 THEN 'Doze' WHEN 13 THEN 'Treze' WHEN 14 THEN 'Quartorze' WHEN 15 THEN 'Quinze' WHEN 16 THEN 'Dezesseis' WHEN 17 THEN 'Dezesete' WHEN 18 THEN 'Dezoito' WHEN 19 THEN 'Dezenove'
		WHEN 20 THEN 'Vinte' WHEN 30 THEN 'Trinta' WHEN 40 THEN 'Quarenta' WHEN 50 THEN 'Cinquenta' WHEN 60 THEN 'Sessenta' WHEN 70 THEN 'Setenta' WHEN 80 THEN 'Oitenta' WHEN 90 THEN 'Noventa' 
		WHEN 1 THEN 'Um' WHEN 2 THEN 'Dois' WHEN 3 THEN 'Tres' WHEN 4 THEN 'Quatro' WHEN 5 THEN 'Cinco' WHEN 6 THEN 'Seis' WHEN 7 THEN 'Sete' WHEN 8 THEN 'Oito' WHEN 9 THEN 'Nove' 
		ELSE NULL END
END
GO
 
CREATE FUNCTION [dbo].[NExtenso_Fator](@Num INTEGER)
	RETURNS INTEGER
AS
BEGIN 
	-- Por Ycaro Afonso 03/12/2011
	-- V 0.1
	IF @Num < 10 RETURN 1
	ELSE IF @Num < 100 RETURN 10
	ELSE IF @Num < 1000 RETURN 100
	ELSE IF @Num < 1000000 RETURN 1000
	ELSE IF @Num < 1000000000 RETURN 1000000
	ELSE IF @Num < 1000000000000 RETURN 1000000000
	RETURN NULL
END
GO
 
CREATE FUNCTION [dbo].[NExtenso_Convert](@Num DECIMAL(18, 6), @Fat DECIMAL(18, 6))
	RETURNS VARCHAR(1000)
AS 
BEGIN 
	-- Por Ycaro Afonso 03/12/2011
	-- V 0.1
	DECLARE @Ret VARCHAR(1000), @_Num DECIMAL(18, 6)
	SET @Ret = ''
	SET @_Num = 0
 
	IF @Fat > 0 BEGIN 
		IF @Num = 1000000000 BEGIN 
			SET @Ret = @Ret + ' Um Bilhão'
		END ELSE IF @Num = 1000000 BEGIN 
			SET @Ret = @Ret + ' Um Milhão'
		END ELSE IF @Num = 1000 BEGIN 
			SET @Ret = @Ret + ' Um Mil'
		END ELSE IF @Num = 100 BEGIN 
			SET @Ret = @Ret + 'Cem'
		END ELSE IF @Num > 10 AND @Num < 20 BEGIN
			SET @Ret = @Ret + ISNULL(dbo.NExtenso_Extenso(@Num) + ' e ', '')
		END ELSE BEGIN 
			IF @Fat >= 1000 BEGIN 
				SET @_Num = CAST((@Num - (@Num % @Fat)) * (CAST(1 AS DECIMAL(18, 6)) / @Fat) AS INTEGER)
 
				IF @_Num = 1 BEGIN 
					SET @Ret = @Ret + ISNULL(dbo.NExtenso_Convert(@Fat, @Fat * .1), '')
				END ELSE BEGIN 
					SET @Ret = @Ret + ISNULL(dbo.NExtenso_Convert(@_Num, dbo.NExtenso_Fator(@_Num)), '') + ' ' + ISNULL(dbo.NExtenso_Extenso(@Fat), '')
				END 
 
				SET @_Num = @Num - (@_Num * @Fat)
 
				SET @Fat = dbo.NExtenso_Fator(@_Num)
 
				SET @Ret = @Ret + CASE WHEN (@Fat > 100 OR @Fat < 100) AND CAST((@_Num - (@_Num % @Fat)) * (CAST(1 AS DECIMAL(18, 6)) / @Fat) AS INTEGER) < 100 THEN ' e ' ELSE ', ' END + ISNULL(dbo.NExtenso_Convert(@_Num, @Fat), '')
			END ELSE BEGIN 
				SET @_Num = @Num - (@Num % @Fat)
				SET @Ret = @Ret + ISNULL(dbo.NExtenso_Extenso(@_Num) + ' e ', '') + dbo.NExtenso_Convert(@Num - @_Num, @Fat * .1)
			END 
		END
	END 
	RETURN REPLACE(REPLACE(@Ret + '.', ' e .', ''), '.', '')
END
GO 
 
CREATE FUNCTION [dbo].[NExtenso](@Num DECIMAL(15, 2))
	RETURNS VARCHAR(1000)
AS 
BEGIN 
	-- Por Ycaro Afonso 03/12/2011
	-- V 0.4
	DECLARE @Ret VARCHAR(500)
	IF @Num > 0 BEGIN 
 
		SET @Ret = ''
		SET @Ret = dbo.NExtenso_Convert(@Num, dbo.NExtenso_Fator(@Num)) + 
			CASE FLOOR(@Num) WHEN 0 THEN '' WHEN 1 THEN ' Real' ELSE ' Reais' END + 
			CASE FLOOR(@Num) WHEN 0 THEN '' ELSE ' e ' END
 
		SET @Num = @Num - FLOOR(@Num) 
		IF @Num > 0 BEGIN 
			--WHILE @Num - FLOOR(@Num) > 0 BEGIN
			--	SET @Num = @Num / .1
			--END 
 
			SET @Num = REPLACE(CAST(@Num AS VARCHAR(20)), '0.', '')
 
			SET @Ret = @Ret + dbo.NExtenso_Convert(@Num, dbo.NExtenso_Fator(@Num)) + CASE @Num WHEN 1 THEN ' Centavo' ELSE ' Centavos' END
		END
	END ELSE BEGIN
		SET @Ret = 'Zero Reais'
	END
	RETURN @Ret
END 
GO
 
-- Exemplo 
SELECT dbo.NExtenso(0)

Primeiro sistema com arduino (Arduino + Botão + Display)

Category : Arduino, Desenvolvimento, Destaque

Lista:
1 Arduino
1 Potenciômetro
1 Resistor
1 Botão
1 Display LCD 16×2
Vários fios

Esquema

Código do Arduino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
 02/09/2011
 by Ycaro Afonso
 */
 
#include 
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
int BotaoPino = 7;
int qtdeBotao = 0;
int ap = 0;
 
void setup() {
  lcd.begin(16, 2);
  lcd.print("oi");
 
  pinMode(BotaoPino, INPUT);
}
 
void loop() {
  if(digitalRead(BotaoPino) == 1){
    if(digitalRead(BotaoPino) != ap){
      ap = 1;
      qtdeBotao++;
    }
  }
  else if(ap == 1){
    ap = 0;
  }
 
  lcd.setCursor(5, 1);
  lcd.print(qtdeBotao);
}

Intellisense para HTML 5 no Visual Studio 2010 e 2008

Category : Desenvolvimento, Dicas

Essa extensão funciona no Visual Studio 2010 e Visual Studio 2008.

1. Baixe e instale a extensão desse link http://visualstudiogallery.msdn.microsoft.com/d771cbc8-d60a-40b0-a1d8-f19fc393127d

2. No Visual Studio, acesse o menu Tools > Options > Text Editor > HTML > Validation e altere a caixa Target para HTML 5

3. Depois é só abrir um projeto e testar com alguma tag no HTML 5

Web.config para WordPress sem erros

Category : ASP.NET, Desenvolvimento, Destaque

Arquivo web.config para utilizar links personalizados (permalinks, links permanentes) no WordPress em servidor ISS (Windows), sem que ocorra erros em outras aplicações do servidor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
  <system.webServer>
     <rewrite>
      <rules>
        <!-- Se possuir mais de um blog no servidor, mude a "name" da linha abaixo para um nome qualquer -->
        <rule name="wordpress" stopProcessing="true"> 
          <match url="^(.*)" />
            <conditions>
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
              <!-- Configure o dominio do blog de acordo com o exemplo da linha abaixo -->
	      <add input="{HTTP_HOST}" pattern="^(www.)?ycaro\.net" ignoreCase="true" /> 
            </conditions>
          <action type="Rewrite" url="index.php" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

DotNetXMLHttpRequest V1.0 – Requisições em ASP.NET

Category : ASP.NET, Destaque, Projetos

A classe DotNetXMLHttpRequest foi desenvolvida por mim e serve para realizar requisições HTTP ou HTTPS com ASP.NET e obter a resposta.

Funciona de forma parecida com o AJAX, com a diferença que no XMLHttpRequest do JAVASCRIPT a execução é feita pelo cliente, e nessa classe é executada no servidor.

O DotNetXMLHttpRequest utiliza o método HttpWebRequest do ASP.NET e com isso é possível fazer requisições web, enviar POST, GET, obter status da URL, fazer download de arquivos, …

Para mais informações do DotNetXMLHttpRequest acesse a página do projeto no Google Code: http://code.google.com/p/dotnetxmlhttprequest/

O uso é bem simples, veja o exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Imports DotNetXmlHttpRequest
 
Module Module1
 
    Sub Main()
        Dim ajax As New XMLHttpRequest
 
 
        ' Teste com GET
        ajax.Open(XMLHttpRequest.EnumMethod.GET, "http://site.ycaro.net/teste.php?teste=123")
        ajax.Send()
        If ajax.readystate = 4 Then
            If ajax.Status = 200 Then
                Console.WriteLine("Teste1: " & ajax.responseText)
            End If
        End If
        ajax.Dispose()
 
 
        ' Teste com POST
        ajax = New XMLHttpRequest
        ajax.Open(XMLHttpRequest.EnumMethod.POST, "http://site.ycaro.net/teste.php")
        ajax.Send("teste=123")
        If ajax.readystate = 4 Then
            If ajax.Status = 200 Then
                Console.WriteLine("Teste2: " & ajax.responseText)
            End If
        End If
        ajax.Dispose()
 
 
        Console.ReadLine()
    End Sub
 
End Module

DotNet: Como usar Queue e Stack

Category : ASP.NET, Desenvolvimento

Esse post explica como usar Queue e Stack.

Nos 2 exemplos foram inseridos 4 itens (item1, item2, item3 e item4)

Veja o resultado final de cada um:

Queue:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Module Module1
    Sub Main()
        Console.WriteLine("----------------- Exemplo com Queue -----------------")
        Dim queueList As New Queue
        queueList.Enqueue("Item1")
        queueList.Enqueue("Item2")
        queueList.Enqueue("Item3")
        queueList.Enqueue("Item4")
        Console.WriteLine("* Queue: O primeiro a ser inserido é o primeiro a sair.")
        Console.WriteLine("* O primeiro da fila é o -&gt; " &amp; queueList.Peek)
        Console.WriteLine("* O primeiro da fila foi pego e removido -&gt; " &amp; queueList.Dequeue)
        Console.WriteLine("* Agora o primeiro da fila é o -&gt; " &amp; queueList.Peek)
 
        Console.WriteLine("* Atualmente contem os itens: ")
        For Each item As String In queueList
            Console.WriteLine(item)
        Next
 
        Console.ReadLine()
    End Sub
End Module

Resultado:

—————– Exemplo com Queue —————–
* Queue: O primeiro a ser inserido é o primeiro a sair.
* O primeiro da fila é o -> Item1
* O primeiro da fila foi pego e removido -> Item1
* Agora o primeiro da fila é o -> Item2
* Atualmente contem os itens:
Item2
Item3
Item4

Stack:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Module Module1
    Sub Main()
        Console.WriteLine("----------------- Exemplo com Stack -----------------")
        Dim _stack As New Stack
        _stack.Push("item1")
        _stack.Push("item2")
        _stack.Push("item3")
        _stack.Push("item4")
 
        Console.WriteLine("Stack: O primeiro a ser inserido é o ultimo a sair.")
        Console.WriteLine("O primeiro da pilha é o -&gt; " &amp; _stack.Peek())
        Console.WriteLine("O primeiro da pilha foi pego e removido -&gt; " &amp; _stack.Pop())
        Console.WriteLine("Agora o primeiro da pilha é -&gt; " &amp; _stack.Peek())
 
        Console.WriteLine("Atualmente contem os itens:")
        For Each item As String In _stack
            Console.WriteLine(item)
        Next
 
        Console.ReadLine()
    End Sub
End Module

Resultado:

—————– Exemplo com Stack —————–
* Stack: O primeiro a ser inserido é o ultimo a sair.
* O primeiro da fila é o -> Item4
* O primeiro da fila foi pego e removido -> Item4
* Agora o primeiro da fila é o -> Item3
* Atualmente contem os itens:
Item3
Item2
Item1

Dot Net: Como fazer um controle TextBox

Category : ASP.NET, Desenvolvimento

O .Net Framework oferece um recurso chamado controle ou componente. Que são todos os itens que você ve na aba Toolbox (TextBox, Button, LinkButton, GridView, …) do Visual Studio.

O que é mais interessante nisso e que facilita muito é que você pode criar componentes personalizados, por exemplo, inputs personalizados com máscaras, ModalPopUp, Abas.

A vantagem de usar um controle, é que é só clicar e arrastar para onde precisar e configurar os parametros, não precisa ficar chamando arquivos ou métodos do javascript, digitando ou copiando linhas e linhas de html, …

O exemplo abaixo é de um controle TextBox com máscara.

Eu fiz esse controle em C# e VB.Net. Se você apenas for usar o controle sem modificar, não tem diferença da linguagem usada.

Para criar esse TextBox, é só seguir esses passos:

1 – Crie um projeto do tipo ASP.NET Web Application.

2 – Crie uma classe que será o controle TextBox personalizado. Eu usei o nome “ControleTextBox”.

O código dessa classe em C#

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System.Web.UI.WebControls;
using System.Web.UI;
 
// Isso serve para adicionar o arquivo .js no controle. 
// Para usar isso, deve mudar o valor da propriedade "Build Action" para "Embedded Resource" do arquivo.
// E o nome é: Nome do projeto . nome do arquivo . extensão do arquivo
[assembly: WebResource("CSharp_Controle_TextBox.ControleTextBox.js", "application/x-javascript")]
 
namespace CSharp_Controle_TextBox
{
    public class ControleTextBox : TextBox
    {
 
        //O Enum cria uma lista de opções
        public enum EnumTipo { 
            Nomal, 
            SoNumero, 
            CPF 
        }
 
        public EnumTipo Tipo
        {
            get;
            set;
        }
 
        protected override void OnPreRender(System.EventArgs e)
        {
            base.OnPreRender(e);
 
            // Chama o arquivo .js para a pagina.
            Page.ClientScript.RegisterClientScriptResource(GetType(), "CSharp_Controle_TextBox.ControleTextBox.js");
 
            switch(Tipo) 
            {
                case EnumTipo.SoNumero:
                    base.Attributes.Add("onkeydown", "Formata_SoNumero(this, event);");
                    base.Attributes.Add("onkeyup", "Formata_SoNumero(this, event);");
                    break;
                case EnumTipo.CPF:
                    base.Attributes.Add("onkeydown", "Formata_CPF(this, event);");
                    base.Attributes.Add("onkeyup", "Formata_CPF(this, event);");
                    base.MaxLength = 14;
                    base.Width = 90;
                    break;
            }
        }
    }
}

 
A mesma classe em VB.NET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'Isso serve para adicionar o arquivo .js no controle. Para usar isso, deve mudar o valor da propriedade "Build Action" para "Embedded Resource" do arquivo.
<Assembly: WebResource("VB.Net_Controle_TextBox.ControleTextBox.js", "application/x-javascript")> 
 
Public Class ControleTextBox
    Inherits TextBox
 
    Private _Tipo As EnumTipo = EnumTipo.Nomal
 
    'O Enum cria uma lista de opções
    Public Enum EnumTipo
        Nomal
        SoNumero
        CPF
    End Enum
 
    Public Property Tipo() As EnumTipo
        Get
            Return _Tipo
        End Get
        Set(ByVal value As EnumTipo)
            _Tipo = value
        End Set
    End Property
 
    Public Overrides Property Text() As String
        Get
            Return MyBase.Text
        End Get
        Set(ByVal value As String)
            'Ao passar um valor pro TextBox, será automaticamente formatado.
            Select Case Tipo
                Case EnumTipo.CPF
                    MyBase.Text = Regex.Replace(String.Format("{0,-11}", value), "^(\d{3})(\d{3})(\d{3})(\d{2})$", "$1.$2.$3-$4")
                Case Else
                    MyBase.Text = value
            End Select
        End Set
    End Property
 
    Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
        MyBase.OnPreRender(e)
 
        'Chama o arquivo .js para a pagina.
        Page.ClientScript.RegisterClientScriptResource(GetType(ControleTextBox), "VB.Net_Controle_TextBox.ControleTextBox.js")
 
        Select Case _Tipo
            Case EnumTipo.SoNumero
                Me.Attributes.Add("onkeydown", "Formata_SoNumero(this, event);")
                Me.Attributes.Add("onkeyup", "Formata_SoNumero(this, event);")
 
            Case EnumTipo.CPF
                Me.Attributes.Add("onkeydown", "Formata_CPF(this, event);")
                Me.Attributes.Add("onkeyup", "Formata_CPF(this, event);")
                Me.MaxLength = 14
                Me.Width = 90
 
        End Select
    End Sub
 
End Class

 
3 – Adicione um arquivo Javascript, com o nome ControleTextBox.js.

View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
function Formata_SoNumero(th) {
    th.value = th.value.replace(/[^\d]/gi, "");
}
 
function Formata_CPF(th, e) {
    th.value = th.value.replace(/[^\d{1}]$/gi, "");
    if ((window.event ? e.keyCode : e.which) != 8) {
        if (th.value.length == 3) th.value = th.value + '.';
        if (th.value.length == 7) th.value = th.value + '.';
        if (th.value.length == 11) th.value = th.value + '-';
    }
}

E nas propriedades desse arquivo, mude o valor do “Build Action” para “Embedded Resource”

4 – De um “Build” no projeto do controle para criar a dll e onde for usar o controle é só adicionar a dll como referência.

5 – Se o controle não aparecer no Toolbox é só clicar com botão direita em uma parte livre da toolbox, ir em Choose Items…

Na janela “Choose Toolbox Items“, clique em “Browse” e selecione a dll e depois clique em OK.

Depois de ter feito isso, é só arrastar o controle para a tela, ir no menu Properties do controle e mudar o Tipo.

Projeto de exemplo no Google Code.



Dot Net: Ler e gravar imagem no banco de dados

Category : ASP.NET, Desenvolvimento

Esse exemplo mostra como enviar uma imagem com o controle FileUpload e salvar em uma tabela do banco de dados Sql Server e como recuperar essa imagem usando um Generic Handler (ASHX).

Gravando a imagem no banco de dados
Exemplo em C#:

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    protected void btnEnviar_Click(object sender, EventArgs e)
    {
        SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
        try
        {
            conexao.Open();
            SqlCommand comando = new SqlCommand("INSERT INTO [DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados] (Imagem) VALUES (@Imagem) ", conexao);
            comando.Parameters.Add("@Imagem", SqlDbType.Image).Value = FileUploadImagem.FileBytes; // O "FileUploadImagem" é a ID do controle FileUpload
            comando.ExecuteNonQuery();
            GridView1.DataBind();
        }
        finally
        {
            conexao.Close();
        }
    }

Exemplo em VB.NET:

1
2
3
4
5
6
7
8
9
10
11
12
    Protected Sub btnEnviar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEnviar.Click
        Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
        Try
            conexao.Open()
            Dim comando As New SqlCommand("INSERT INTO [DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados] (Imagem) VALUES (@Imagem) ", conexao)
            comando.Parameters.Add("@Imagem", Data.SqlDbType.Image).Value = FileUploadImagem.FileBytes ' O "FileUploadImagem" é a ID do controle FileUpload
            comando.ExecuteNonQuery()
            GridView1.DataBind()
        Finally
            conexao.Close()
        End Try
    End Sub

Recuperando a imagem do banco

Para recuperar ou transformar de volta em imagem o que está no banco de dados, é usado um arquivo do tipo “Generic Handler”, com o seguinte código.

Exemplo em C#:

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public void ProcessRequest (HttpContext context) {
        if(string.IsNullOrEmpty(context.Request.QueryString["id"])) {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Está faltando a querystring id.");
        } else {
            context.Response.ContentType = "image/jpeg";
            SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
            try {
                conexao.Open();
                SqlCommand comando = new SqlCommand("SELECT Imagem FROM DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados WHERE IDImagem = @IDImagem", conexao);
                comando.CommandType = CommandType.Text;
                comando.Parameters.Add("@IDImagem", SqlDbType.Int).Value = context.Request.QueryString["id"];
                context.Response.Clear();
                context.Response.BinaryWrite((byte[])comando.ExecuteScalar());
            } finally{
                conexao.Close();
            }
        }
    }

Exemplo em VB.NET:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        If String.IsNullOrEmpty(context.Request.QueryString("id")) Then
            context.Response.ContentType = "text/plain"
            context.Response.Write("Está faltando a querystring id.")
        Else
            context.Response.ContentType = "image/jpg"
            Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
            Try
                conexao.Open()
                Dim comando As New SqlCommand("SELECT Imagem FROM DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados WHERE IDImagem = @IDImagem", conexao)
                comando.CommandType = CommandType.Text
                comando.Parameters.Add("@IDImagem", SqlDbType.Int).Value = context.Request.QueryString("id")
                context.Response.Clear()
                context.Response.BinaryWrite(comando.ExecuteScalar)
            Catch ex As Exception
 
            Finally
                conexao.Close()
            End Try
        End If
    End Sub


Se você quiser mostrar as imagens direto na gridview, é só adicionar uma coluna na grid e passar o link do .ASHX com a querystring “id”. Igual ao exemplo abaixo:

1
2
3
4
5
	<asp:TemplateField HeaderText="Imagem">
		<ItemTemplate>
			<asp:Image ID="Image1" ImageUrl='<%# String.Concat("GerarImagem.ashx?id=", Eval("IDImagem")) %>' runat="server" />
		</ItemTemplate>
	</asp:TemplateField>

Porém essa não é a melhor solução, porque a cada linha da grid o ASHX vai fazer uma conexão no banco para retorna a imagem. Para isso, a melhor solução é salvar a imagem em um diretório e guardar apenas o link no banco de dados.

O projeto completo de exemplo, com os codigos está armazenado no Google Code (VB.NET e C#).

Scrum na Globo.com – Falando em Agile: Derrubando Mitos

1

Category : Desenvolvimento, Destaque, Palestra

“Falando em Agile” é um evento realizado pela empresa Caelum. E essa palestra foi realizado em 2008, pelo Danilo Bardusco e o nome é “Scrum na Globo.com: – Derrubando Mitos”.

Os slides dessa palestra:

- Mais palestras desse evento no site Vimeo.com.

- Mais informações e palestras desse palestrante no blog do próprio Danilo Bardusco.

Dot Net: GridView paginada com checkbox

Category : ASP.NET, Desenvolvimento

Essa solução serve para manter o checkbox checado depois que mudar a página na GridView e salvar todos os marcados quando clicar em um botão.

Fiz um exemplo para C# (CSharp) e outro para VB.NET.

O projeto completo de exemplo, com o codigo da página .aspx está armazenado no Google Code (VB.NET e C#).

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
 
public partial class _Default : System.Web.UI.Page
{
 
    /// <summary>
    /// Armazena as ID's em uma viewstate
    /// </summary>
    public List<int> lstIdChkChecados
    {
        get
        {
            if (ViewState["lstIdChkChecados"] == null)
            {
                ViewState["lstIdChkChecados"] = new List<int>();
            }
            return (List<int>)ViewState["lstIdChkChecados"];
        }
        set
        {
            ViewState["lstIdChkChecados"] = value;
        }
    }
 
    /// <summary>
    /// atualiza o viewstate com as ID's da DataKey (DataKeyNames) da gridview.
    /// </summary>
    protected void AtualizaViewStateChkChecados()
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox Chk = ((CheckBox)row.FindControl("CheckBox1"));
            if (Chk.Checked)
            {
                if (!lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]))
                {
                    lstIdChkChecados.Add((int)GridView1.DataKeys[row.RowIndex][0]);
                }
            }
            else
            {
                if (lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]))
                {
                    lstIdChkChecados.Remove((int)GridView1.DataKeys[row.RowIndex][0]);
                }
            }
        }
    }
 
    /// <summary>
    /// Quando clica para mudar de página, é executado o método AtualizaViewStateChkChecados() antes de atualizar o GridView.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        AtualizaViewStateChkChecados();
    }
 
    /// <summary>
    /// Depois que ocorre a mudança, verifica se na página atual da GridView existe checkbox marcados.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GridView1_PreRender(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            foreach (DataRowView row in SqlDataSource1.Select(DataSourceSelectArguments.Empty))
            {
                if ((bool)row["Ativo"])
                {
                    lstIdChkChecados.Add((int)row["ID"]);
                }
            }
        }
        foreach (GridViewRow row in GridView1.Rows)
        {
            ((CheckBox)row.FindControl("CheckBox1")).Checked = lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]);
        }
    }
 
    /// <summary>
    /// Atualiza a tabela do banco de dados usando lstIdChkChecados
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnAtualizar_Click(object sender, EventArgs e)
    {
        AtualizaViewStateChkChecados();
        SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
        try
        {
            conexao.Open();
 
            SqlCommand comando = new SqlCommand();
            comando.Parameters.Add("@Ativo", SqlDbType.Bit).Value = false;
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo";
            comando.CommandType = CommandType.Text;
            comando.Connection = conexao;
            comando.ExecuteNonQuery();
 
            // Antes de fechar a conexão, passa por todos os itens do lstIdChkChecados e atualiza no banco, passando o campo Ativo para true.
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo WHERE ID = @ID";
            comando.Parameters[0].Value = true;
            comando.Parameters.Add("@ID", SqlDbType.Int);
            foreach (int item in lstIdChkChecados)
            {
                comando.Parameters[1].Value = item;
                comando.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
 
        }
        finally
        {
            conexao.Close();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Imports System.Data
Imports System.Data.SqlClient
 
Partial Class _Default
    Inherits System.Web.UI.Page
 
    ''' <summary>
    ''' Armazena as ID's em uma viewstate
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property lstIdChkChecados() As List(Of Integer)
        Get
            If ViewState("lstIdChkChecados") Is Nothing Then ViewState("lstIdChkChecados") = New List(Of Integer)
            Return ViewState("lstIdChkChecados")
        End Get
        Set(ByVal value As List(Of Integer))
            ViewState("lstIdChkChecados") = value
        End Set
    End Property
 
    ''' <summary>
    ''' atualiza o viewstate com as ID's da DataKey (DataKeyNames) da gridview.
    ''' </summary>
    ''' <remarks></remarks>
    Sub AtualizaViewStateChkChecados()
        Dim Chk As CheckBox
        For Each row As GridViewRow In GridView1.Rows
            Chk = DirectCast(row.FindControl("CheckBox1"), CheckBox)
 
            If Chk.Checked Then
                If Not lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0)) Then
                    lstIdChkChecados.Add(GridView1.DataKeys(row.RowIndex)(0))
                End If
            Else
                If lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0)) Then
                    lstIdChkChecados.Remove(GridView1.DataKeys(row.RowIndex)(0))
                End If
            End If
        Next
    End Sub
 
    ''' <summary>
    ''' Quando clica para mudar de página, é executado o método AtualizaViewStateChkChecados() antes de atualizar o GridView.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
        AtualizaViewStateChkChecados()
    End Sub
 
    ''' <summary>
    ''' Depois que ocorre a mudança, verifica se na página atual da GridView existe checkbox marcados.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub GridView1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.PreRender
        If Not IsPostBack Then
            For Each row As DataRowView In SqlDataSource1.Select(DataSourceSelectArguments.Empty)
                If row("Ativo") Then
                    lstIdChkChecados.Add(row("ID"))
                End If
            Next
        End If
        For Each row As GridViewRow In GridView1.Rows
            DirectCast(row.FindControl("CheckBox1"), CheckBox).Checked = lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0))
        Next
    End Sub
 
    ''' <summary>
    ''' Atualiza a tabela do banco de dados usando lstIdChkChecados
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub btnAtualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAtualizar.Click
        AtualizaViewStateChkChecados()
 
        Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
        Try
            ' Primeiro atualiza todos os registros, passando o campo Ativo para FALSE
            ' Se for usar em uma tabela com muitos registros, deve arrumar uma solução para um melhor desempenho
            conexao.Open()
            Dim comando As New SqlCommand
            comando.Parameters.Add("@Ativo", SqlDbType.Bit).Value = False
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo"
            comando.CommandType = CommandType.Text
            comando.Connection = conexao
            comando.ExecuteNonQuery()
 
            ' Antes de fechar a conexão, passa por todos os itens do lstIdChkChecados e atualiza no banco, passando o campo Ativo para true.
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo WHERE ID = @ID"
            comando.Parameters(0).Value = True
            comando.Parameters.Add("@ID", SqlDbType.Int)
            For Each item As Integer In lstIdChkChecados
                comando.Parameters(1).Value = item
                comando.ExecuteNonQuery()
            Next
 
        Catch ex As Exception
 
        Finally
            conexao.Close()
        End Try
 
 
    End Sub
 
End Class