segunda-feira, 30 de abril de 2001

0

Paginação no ASP.NET com C#

O exemplo de paginação abaixo foi construído com recortes de diversos sites e mostra um grid de paginação, acessando um banco de dados Access.


<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.ADO" %>


<script language="C#" runat="server">


void Page_Load( Object sender, EventArgs e ){
    BindGrid();
}


void MyDataGrid_Page( Object sender, DataGridPageChangedEventArgs e){
    int startIndex = MyDataGrid.CurrentPageIndex * MyDataGrid.PageSize;
    BindGrid();
    ShowStats();
}


void BindGrid(){


     DataSet DS = new DataSet();
     ADODataSetCommand MyCommand = new ADODataSetCommand( "select * from Links", "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + Server.MapPath("data.mdb") );


     MyCommand.FillDataSet( DS, "Links" );


     MyDataGrid.DataSource = DS.Tables["Links"].DefaultView;
     MyDataGrid.DataBind();


     ShowStats();
}


void PagerButtonClick( Object sender, EventArgs e ){


     string arg = ((LinkButton)sender).CommandArgument;
     switch ( arg ){
        case "next":
             if (MyDataGrid.CurrentPageIndex < (MyDataGrid.PageCount - 1)) MyDataGrid.CurrentPageIndex += 1;
             break;
        case "prev":
             if (MyDataGrid.CurrentPageIndex > 0) MyDataGrid.CurrentPageIndex -= 1;
             break;
        case "last":
             MyDataGrid.CurrentPageIndex = (MyDataGrid.PageCount - 1);
             break;
        default:
             // page number
             MyDataGrid.CurrentPageIndex = arg.ToInt32();
     }


     BindGrid();
     ShowStats();
}


void ShowStats(){
    lblCurrentIndex.Text = "CurrentPageIndex is " + MyDataGrid.CurrentPageIndex;
    lblPageCount.Text = "PageCount is " + MyDataGrid.PageCount;
}
</script>



<form runat="server">


<ASP:DataGrid id="MyDataGrid" runat="server"
AllowPaging="True"
PageSize="5"
PageCount="1"
PagerStyle-Mode="NumericPages"
PagerStyle-HorizontalAlign="Right"
OnPageIndexChanged="MyDataGrid_Page"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</form>


<p>


<asp:LinkButton id="btnFirst" runat="server"
Text="Go to the first page"
CommandArgument="0"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
&nbsp;
<asp:LinkButton id="btnPrev" runat="server"
Text="Previous page"
CommandArgument="prev"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
&nbsp;
<asp:LinkButton id="btnNext" runat="server"
Text="Next page"
CommandArgument="next"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
&nbsp;
<asp:LinkButton id="btnLast" runat="server"
Text="Go to the last page"
CommandArgument="last"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>


<p>


<table bgcolor="#eeeeee" cellpadding="6"><tr><td nowrap><font face="Verdana" size="-2">


<asp:Label id="lblCurrentIndex" runat="server" /><br>
<asp:Label id="lblPageCount" runat="server" /><br>



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0

Quebra de Linha: do BD para HTML

Um problema bastante comum: o usuário efetua cadastro de campos longos de textos ou do tipo MEMO e deseja que as quebras de linhas que ele digita na TEXTAREA permaneçam quando ele requisitar que uma página mostre seu conteúdo. Ora, se você teve um pouco de curiosidade, já notou que o script ASP (via execução direta de comando SQL ou métodos do recordset) salva direitinho no banco de dados as quebras de linha, pois se você requisitar que o conteúdo do campo seja escrito numa TEXTAREA, você vislumbrará as quebras. Só que quando você tenta escrevê-lo no corpo do HTML, não obtem o mesmo resultado. Como proceder? Basta usar o seguinte código para escrever o campo no corpo do HTML:


response.write replace(campotexto, vbcrlf,"<br>")


A função replace serve para substituir dentro de uma string (no caso campotexto) o segundo argumento da função (no caso a constante vbcrlf, que indica dentro de uma string uma quebra de linha) pelo terceiro argumento da função (o velho e bom <br>, a quebra de linha do HTML)



Esta matéria foi postada originalmente no ASP4Developers por Adriano Nântua, que na época era "Engenheiro de software e analista de sistemas; Desenvolvedor ASP, Delphi, C/C++ e Java/JSP/Servlets; InterBase fan; Linux fan; Alvirrubro inveterado.". Hoje, vai saber...

sexta-feira, 27 de abril de 2001

0

ASP e XML (Parte I)

Receita de bolo: ASP com XML ao rum

 

Ingredientes:

- um arquivo .XML

- uma página .ASP

- servidor web (PWS/IIS)

- MSXML3

 

Modo de preparo:


 

- crie um arquivo chamado "teste.xml" com o seguinte conteúdo:

<teste />

 

- crie um arquivo .ASP, como segue (index.asp):

<%

set xmlDoc = server.createObject("MSXML2.DOMDocument")


xmlDoc.async = false


xmlDoc.load( server.mappath( "teste.xml" )

response.write "<xmp>" & xmlDoc.xml & "</xmp>"

%>

 

- coloque os dois arquivos em uma pasta virtual e, do browser, chame:


 

-Sirva quente.

 

Rendimento:

Muita diversão e informação.

 

PS: O MSXML SDK contém apenas a documentação do MSXML. Recomendo a sua instalação e leitura detalhada.


Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0

ASP e XML (Parte II)

Um exemplo mais intuitivo e com mais elementos.

 

teste.xml

<?xml version="1.0" encoding="iso-8859-1"?>
<documento>
    <titulo>Primeira pagina em XML</titulo>
    <corpo> Hello World! </corpo>
</documento>

 

teste.xsl

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" >
 <xsl:output method="html" omit-xml-declaration="yes" />
 <xsl:template match="/">

  <title><xsl:value-of select="//titulo/text()"/></title>
  <body><xsl:value-of select="//corpo/text()"/></body>
 </xsl:template>
</xsl:stylesheet>

 

index.asp

<%

set xmlDoc = server.createObject( "MSXML2.DOMDocument" )



xmlDoc.async = false


xmlDoc.load ( server.mappath( "teste.xml" ) )


 

set xslDoc = server.createObject( "MSXML2.DOMDocument" )


xslDoc.async = false


xslDoc.load ( server.mappath( "teste.xsl" ) )

 

xmlDoc.transformNodeToObject xslDoc, Response 'exibe dados

%>


Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0

XML (exemplo)

produtos.xml


<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="produtos.xsl"?>
<produtos>
  <produto>
     <codigo>111</codigo>
     <descricao>COMP. I KII</descricao>
     <valor>2345,67</valor>
  </produto>
  <produto>
     <codigo>222</codigo>
     <descricao>KLY  500 MM</descricao>
     <valor>3456,78</valor>
  </produto>
  <produto>
     <codigo>333</codigo>
     <descricao>COMP. PENT. 67 A</descricao>
     <valor>1456,78</valor>
  </produto>
  <produto>
     <codigo>444</codigo>
     <descricao>NET KP 6 SERVER</descricao>
     <valor>2456,78</valor>
  </produto>
  <produto>
     <codigo>555</codigo>
     <descricao>NET KJ  5 WORKSTATION</descricao>
     <valor>9890,67</valor>
  </produto>
  <produto>
     <codigo>666</codigo>
     <descricao>KL 3 ASUS C5</descricao>
     <valor>2345,67</valor>
  </produto>
  <produto>
     <codigo>777</codigo>
     <descricao>KG PII AMD</descricao>
     <valor>3456,78</valor>
  </produto>
  <produto>
     <codigo>888</codigo>
     <descricao>PENTIUM III</descricao>
     <valor>4000</valor>
  </produto>
  <produto>
     <codigo>999</codigo>
     <descricao>AMD ATHLONN</descricao>
     <valor>3850</valor>
  </produto>
</produtos>


produtos.xsl


<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="
http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="2">
      <tr>
        <th>Codigo</th>
        <th>Descricao</th>
        <th>Valor</th>
      </tr>
      <xsl:for-each select="produtos/produto">
      <tr>
        <td><xsl:value-of select="codigo"/></td>
        <td><xsl:value-of select="descricao"/></td>
        <td><xsl:value-of select="valor"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>



Esta matéria foi postada originalmente no ASP4Developers por Osvaldo da Silva Machado Jr, que na época era "Muito 10 o site de vcs, gostei a rolé!!". Hoje, vai saber...

quinta-feira, 26 de abril de 2001

0

Criando uma conexão usando provider

Muitas pessoas que iniciam ou até as mais experientes realizam suas conexões com o banco de dados de um modo funcional, mas não visam um detalhe extremamente importante que é a velocidade do acesso aos dados.
Pois nesta dica você vai aprender a fazer suas futuras conexões com o banco de dados de forma eficiente e rápido utilizando provider.
Ao se programar em asp, uma das prioridades para trabalhar com banco de dados é fazer uma conexão com o banco de dados e manipular seus dados contidos de forma rápida e eficiente. Veja abaixo um exemplo convencional e um utilizando provider:


Exemplo de conexão convencional:


Dim Conexao
Set Conexao = Server.CreateObject("ADODB.Connection")
Conexao.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\db\bancodedados.mdb")




Exemplo de conexão usando provider:


Dim Conexao
Set Conexao = Server.CreateObject("ADODB.Connection")
Conexao.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & Server.MapPath("\db\bancodedados.mdb")




Entendendo a conexão com o banco de dados utilizando provider:



Dim Conexao
Set Conexao = Server.CreateObject("ADODB.Connection")


Primeiramente é instanciado uma conexão com o objeto ADO ( ActiveX Data Object ) para a manipulação dos dados no banco de dados, conforme o exemplo acima.



Conexao.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & Server.MapPath("\db\bancodedados.mdb")


Após isso, é feita a abertura do banco de dados utilizando um provider ( vinculação de dados ), que utiliza recursos interno do servidor web, onde se torna mais rápido o acesso aos dados no banco de dados, veja acima o exemplo.



Conexao.Open "Provider=Microsoft.Jet.OLEDB.4.0;


Provider, é a variável aonde é declarado qual tipo de vinculação de dados será realizado na sua conexão, onde no exemplo exibido acima, é aplicado para banco de dados no formato Microsoft Access 95/97/2000.



Data Source =" & Server.MapPath("\db\bancodedados.mdb")



O parâmetro Data Source é aonde será especificado o caminho lógico do seu banco de dados, aonde utilizamos a função Server.MapPath onde permite que seja definido um caminho lógico, onde se encontra o seu banco de dados, onde db seria a pasta onde esta armazenado e bancodedados.mdb o nome do banco de dados a ser aberto.



André Luis Bassi é desenvolvedor em ASP, onde presta serviço para diversas empresas.



Esta matéria foi postada originalmente no ASP4Developers por André Luis Bassi (site), que na época era "Webmaster / DBA / Programador". Hoje, vai saber...

0

Código para exibir o Beat - o horário mundial da Internet

Segue em anexo abaixo um exemplo de como calcular a hora internacional da Internet, chamado como Beat.


Código simples e comentado para entender a funcionalidade !


<%


' Declarando as variaveis
Dim min, hor, minuto, hor_fus, trans, hor_temp, hor_beat, horr


' O valor de 1 minuto
min = 60


' pego a hora
hor = hour(time)


' Pego o minuto
minuto = minute(time)


' Adiciono +5 horas no horario atual
hor_fus= hor + 5


' Transformo a horas em minutos
trans = hor_fus * min


' Soma o total das horas convertidas em minutos + minutos atuais
hor_temp = trans + minuto


' Transformando os minutos em segundos e calcula com o valor do Beat
hor_beat= hor_temp * 60 / 86.4


if hor_beat >= 1000 Then
   horr = hor_beat - 1000
   response.write cint(horr)
else
   ' Exibo os valores no browser
   response.write "Hora atual em BEAT" & " " & cint(hor_beat)
end if


%>


 


André Luis Bassi é desenvolvedor em ASP, onde presta serviço para diversas empresas.



Esta matéria foi postada originalmente no ASP4Developers por André Luis Bassi (site), que na época era "Webmaster / DBA / Programador". Hoje, vai saber...

quarta-feira, 25 de abril de 2001

0

Cálculo de Fatoriais

Muita gente precisa usar o cálculo de número fatorias, os famoso N!. Para quem interessar, segue a implementação do código em VBScript.


Function Fatorial( num )
   Dim i, result
   result = 1


   If( num > 0 ) Then
      For i = num to 1 Step -1
         result = result * i
      Next
   ElseIf( num = 0 ) Then
       result = 0
   Else
      For i = num To -1 Step +1
          result = result * i
      Next
    End If


    Fatorial = result
End Function


Nota do editor: E, para quem gosta de brincar com recursividade, o código ficaria assim:


Function fatorial( numero )
 if numero > 1 then fatorial = numero * fatorial( numero - 1 ) else fatorial = 1
End Function



Esta matéria foi postada originalmente no ASP4Developers por Daniel Destro do Carmo (site), que na época era "Analista de Sistemas, Web Developer e Programador Java certificado pela Sun.". Hoje, vai saber...

2

Projeto de sites

Olá pessoal,


    Vejo freqüentemente pessoas buscando a internet como forma fácil e rápida de se ganhar dinheiro. É aí que mora o perigo. O mercado acaba (está) ficando saturado e o pior, cheio de péssimos profissionais. Mas como distinguir o bom do mal profissional? Pelo projeto.


    Fazer um site, ainda mais quando se envolve parte dinâmica, acesso à conteúdo e lógica, não é fácil. Um bom projeto é essencial para o futuro e o sucesso do site. Hoje, nas empresas que produzem projetos, estima-se a seguinte disponibilidade de tarefas para a produção de um projeto:


- 5 % do tempo na análise do projeto
- 10 % na modelagem do projeto
- 60 % na implementação do projeto
- 5 % na fase de testes
- 20 % na manutenção e debugação


    Mas como? 20% arrumando erros? Tempo é dinheiro, e quanto mais bem projetado for, menor a chance de erros, certo!


   Por que não gastar mais tempo na analise e modelagem do que na manutenção e debugação?


    Tarefas como definir o perfil e o foco do projeto são essenciais, assim como definir o fluxo de tudo isso, além de como deve ser implementado isso (modelo).


    Sempre procure usar o modelo MVC (modelo de 3 camadas), que separa as regras de negócio, do módulo visual e do acesso a dados.


    Isso com certeza facilitará a manutenção, escalabilidade e reuso do código implementado. Além de prover maior clareza do projeto.


Bom, espero ter ajudado.
Caso alguém tenha interesse em discutir esse assunto mais a fundo estarei aberto a discussões.


Recomendo:
- ler algum material sobre UML
- ler sobre projetos
- orientação a objetos



Esta matéria foi postada originalmente no ASP4Developers por Daniel Destro do Carmo (site), que na época era "Analista de Sistemas, Web Developer e Programador Java certificado pela Sun.". Hoje, vai saber...

0

Código de paginação

Fazer uma paginação nada mais é do que, pegar um recordset e dividí-lo em páginas, contendo, cada uma delas, uma pequena quantidade de registros, de forma a facilitar a visualização dos dados pelos usuários, no caso de consultas que retornam um número grande de registros.


Como as dúvidas sobre paginação são freqüentes, montei o código abaixo. As únicas coisas que precisam ser alteradas é o nome do banco de dados e o comando SQL. O código está comentado a cada rotina, facilitando a compreensão dos procedimentos envolvidos.


<%


Const TamanhoPagina = 10 'Define o número de registros por página


' Inicialmente, criaremos o objeto connection que irá acessar o banco de dados.
' Note que, antes de abrirmos este objeto, precisamos definir a propriedade
' CursorLocation


set Conn = Server.CreateObject("ADODB.Connection")
Conn.CursorLocation = 3  'adUseClientBatch
Conn.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.mappath("data.mdb")


' Aqui, criamos o recorset. Precisamos definir o PageSize, como sendo o número de registros
' por página que desejamos e o CursorType para 3, por garantia.


set rsQuery = Server.CreateObject( "ADODB.RecordSet" )
rsQuery.PageSize   = TamanhoPagina
rsQuery.CacheSize  = TamanhoPagina
rsQuery.CursorType = 3
rsQuery.Open "select * from users order by userId", Conn


' Nas linhas abaixo, é feita a validação da seleção do usuário, evitando
' que ele coloque o que quiser na URL, fazendo sua página falhar.


if Session("PaginaAtual") = "" then Session("PaginaAtual") = 1
select case Request.QueryString( "modo" )
       case "proxima"
            Session("PaginaAtual") = min( Session("PaginaAtual") + 1, rsQuery.PageCount )
       case "anterior"
            Session("PaginaAtual") = max( Session("PaginaAtual") - 1, 1 )
       case "pagina"
            if isNumeric( request.QueryString("numero") ) then
               Session("PaginaAtual") = cint( request.QueryString("numero") )
               Session("PaginaAtual") = max( min( Session("PaginaAtual"), rsQuery.PageCount ), 1 )
            end if
end select


' Uma vez definida qual é a página atual, passamos esta informação para
' o recordset ser posicionado no primeiro registro da página desejada
rsQuery.AbsolutePage = Session("PaginaAtual")
limite = rsQuery.Fields.Count - 1


%>
<html>
<title>Exemplo básico de paginação</title>
<body>
 <table width="100%" align=center border=1>
  <tr class="color2"><%


' Aqui nós mostramos todos os campos do recordset.
' Você pode removê-la e incluir seu próprio cabeçalho personalizado.


   For n = 0 To limite %>
   <th><%= rsQuery.Fields.Item(n).name %></th><%
   Next %>
  </tr><%


' Passemos para a exibição da página do recordset em si.
' Devemos mostrar (TamanhoPagina) registros ou até o fim do recordset, o que vier primeiro.


   item  = 1
   do while item <= TamanhoPagina and not rsQuery.eof
      %>
  <tr class="color<%= ( item mod 2 ) %>"><%
      For n = 0 To limite %>
   <td valign=top><small><%= rsQuery( n ) %>&nbsp;</small></td><%
      next %>
  </tr><%
      rsQuery.movenext
      item = item + 1
   loop


' Logo abaixo, mostramos a quantidade de registros
' e os links para o usuário alternar entre as páginas


%>
 </table>
 <p>
  Há <%= rsQuery.RecordCount %> registros no banco de dados<br>
  Você está na página <%= Session("PaginaAtual") %> de <%= rsQuery.PageCount %><br>
  Ir para página: <%


 if Session("PaginaAtual") > 1 then 'Colocar o link para página anterior se não for a primeira
    response.write "<a href=""index.asp?modo=anterior"">Anterior</a>&nbsp;"
 end if


 for n = 1 to rsQuery.pageCount
     if n = Session("PaginaAtual") then
        response.write n & "&nbsp;" ' Se for a página atual, não colocar link, só o número dela.
     else
        response.write "<a href=""index.asp?modo=pagina&numero=" & n & """>" & n & "</a>&nbsp;"
     end if
 next


 if Session("PaginaAtual") < rsQuery.pageCount then 'Colocar o link para próxima página se não for a última
    response.write "<a href=""index.asp?modo=proxima"">Próxima</a>&nbsp;"
 end if
 %>
 </p>
 <center>Visite <a href="
http://asp4developers.cjb.net">ASP4Developers</a></center>
</body>
</html>
<%


'Rotinas genéricas, para facilitar a programação:
' IIF: Retorna o valor1, caso a condição seja verdadeira; caso contrário, retorna valor2
function iif ( condicao, valor1, valor2 )
 if condicao then iif = valor1 else iif = valor2
end function


' MIN: Retorna o menor valor dentre dois passados
function min( value1, value2 )
 min = iif( value1 < value2, value1, value2 )
end function


' MAX: Retorna o maior valor, dentre dois passados
function max( value1, value2 )
 max = iif( value1 > value2, value1, value2 )
end function


%>



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

sexta-feira, 20 de abril de 2001

0

Trabalhando com LCID e evitando problemas com datas

Sempre vejo várias perguntas no news de ASP, sobre problemas com datas, principalmente em consultas SQL, onde é preciso ficar utilizando a função format(var,"dd/mm/yyyy"), e mesmo assim muitos problemas ocorrem com este tipo de função.


Este é um código para consultar qual LCID deve-se usar, pois em vários testes  feitos por mim, observei que em alguns servidores os códigos variam.


Vamos então ao código: (Este código pode conter erros principalmente de programação).


<%
on Error Resume Next
contador = 0
%>
<table>
<%
for x = 1000 to 2500
Session.lcid = x
if contador = 0 response.write "<tr>"
contador + 1
%>
<td><b><%=x%></b></td><td><%=date%></td>
<%
if contador = 6 response.write "<tr>"
%>
</table>


Pronto, agora é só fazer seu testes.



Esta matéria foi postada originalmente no ASP4Developers por André Guergolet (site), que na época era "Desenvolvedor de aplicativos voltados a WEB à 3 anos. Atualmente trabalha com aplicativos de monitoração de redes utilizando .NET e outros recursos.". Hoje, vai saber...

terça-feira, 17 de abril de 2001

0

Resolva problemas com datas gravadas com formato string (texto)

Talvez você já tenha se deparado com a seguinte situação: colocou as datas em formato string num banco de dados para dar menos trabalho e tudo mais... só que na hora de pesquisar elas, vem o problema: ordenar strings data, fatalmente não retorna o que queremos. Para isso, desenvolvi uma simples cláusula SQL, pegando informações daqui e dali e que pode lhe ser útil:


strSQL = "SELECT * FROM tabela ORDER BY datevalue(data) DESC"


Nos testes, a cláusula se mostrou eficiente. Contudo, não foi testada com uma data no formato americano (mm/dd/yyyy). Qualquer erro, o idel seria formatar o campo de data da tabela, para o formato americano. Exemplo: se você quiser consultar intervalos de datas que estejam como string, precisará fazer algo como:


sql="SELECT * FROM tabela WHERE datevalue(data)>= #" & mes_menor & dia_menor & ano_menor & "# and datevalue(data)<= #"  & mes_maior & "/" & dia_maior & "/" & ano_maior & "# ORDER BY datevalue(data) DESC"


Os operadores lógicos substituem o operador SQL, o BETWEEN.



Esta matéria foi postada originalmente no ASP4Developers por Eduardo Patriota Gusmão Soares, que na época era "Programador de ASP e VB. Trabalha como webmaster e webdesigner numa empresa de criação de páginas para Internet.
Participante ativo do news de ASP.". Hoje, vai saber...

segunda-feira, 16 de abril de 2001

0

Analisando o .NET

Com o .NET, a Microsoft conseguiu finalmente criar um estilo de programar com o poder do Java mas com o estilo "Windows de ser". O VisualStudio.NET ainda não foi lançado oficilamente, mas várias comparações com o Java Framework já apareceram. A mais comentada em newsgroups é a CLR (Common Language Runtime). CLR é uma JVM no estilo Microsoft. Programas desenvolvidos em C#, por exemplo, são executados através da CLR e uma linguagem interna (IL). A Sun vem alardando em seu site http://java.sun.com que o framework .NET é uma cópia do Java. Porém, quanto à CLR, a Sun esqueceu de dizer que é muito mais rápida que a JVM. Criar aplicativos Java para usuários domésticos atualmente é inconcebível, pois necessita-se do JRE (inclui a JVM) e ainda o desempenho é péssimo. Em contraste, o C# utiliza a CLR de forma "ëmbutida" sem necessitar de um segundo aplicativo, como a JRE.


O C# ainda tem outras vantagens sobre Java: ela herda todos os recursos e coleções do Visual C++ mas adota uma maneira simples de programar, assim como em VB. Muitos comentam que pode ser boa, mas é só para o Windows. Isso não é verdade, futuramente, poderão surgir versões da CLR para Linux, Mac e outros sistemas populares.


O C# também irá agradar os programadores Java, adotando o mesmo conceito de programação. Programadores Java experientes já estão semi-aptos a programar em C#.


Exemplo Hello, World:


using System;


class Hello
{
static void Main() {
Console.WriteLine("Hello, world");
}
}


O C# tem o conceito de namespaces ao invés de utilizar diretivas "import" do Java. No exemplo Hello World, utlizamos "using System" para importar bibliotecas do sitema.


Espero ter ajudado na decisão que muitos programadores tem que fazer: Em qual linguagem se especializar?



Esta matéria foi postada originalmente no ASP4Developers por Peter Parker (site), que na época era "Desenvolvedor C , VisualBasic, ASP e ASP.NET. Enfim, leitor de gibis do Spider-Man :)". Hoje, vai saber...

0

Identificando o endereço MAC da placa de rede

O script abaixo, mediante uma chamada ao Window Script Host, retorna o endereço MAC da placa de rede instalada no client. Note que este script não pode ser executado da máquina com o servidor web.


<%@ LANGUAGE="VBSCRIPT"%>
<%


'**************************************
' Name: MAC address
' Description:Get the clients MAC(Media Access Control)
'  address, a hardware address that uniquely
'  identifies Each node of a network. Works great on
'  LAN's. Firewalls and Proxy's will be an issue
'  depending what side of them you're coding for.
' By: Jerry Aguilar
'
'
' Inputs:None
'
' Returns:Returns the client IP and MAC
'     address.
'
'Assumes:You can't navigate to it running
' PWS on the same pc but If you are running PWS, you can navigate
' To it from another pc on the same lan (it does
' Not like 127.0.0.1)
'
'Side Effects:None
'
'Warranty:
'code provided by Planet Source Code(tm)
'     (
http://www.Planet-Source-Code.com) 'as
'     is', without warranties as to performanc
'     e, fitness, merchantability,and any othe
'     r warranty (whether expressed or implied
'     ).
'Terms of Agreement:
'By using this source code, you agree to
'     the following terms...
' 1) You may use this source code in per
'     sonal projects and may compile it into a
'     n .exe/.dll/.ocx and distribute it in bi
'     nary format freely and with no charge.
' 2) You MAY NOT redistribute this sourc
'     e code (for example to a web site) witho
'     ut written permission from the original
'     author.Failure to do so is a violation o
'     f copyright laws.
' 3) You may link to this code from anot
'     her website, provided it is not wrapped
'     in a frame.
' 4) The author of this code may have re
'     tained certain additional copyright righ
'     ts.If so, this is indicated in the autho
'     r's description.
'**************************************


strIP = Request.ServerVariables("REMOTE_ADDR")
strMac = GetMACAddress(strIP)
strHost = Request.ServerVariables("REMOTE_HOST")


Function GetMACAddress(strIP)
 Set net = Server.CreateObject("wscript.network")
 Set sh = Server.CreateObject("wscript.shell")
 sh.run "%comspec% /c nbtstat -A " & strIP & " > c:\" & strIP & ".txt",0,true
 Set sh = nothing
 Set fso = createobject("scripting.filesystemobject")
 Set ts = fso.opentextfile("c:\" & strIP & ".txt")
 macaddress = null
 Do While Not ts.AtEndOfStream
    data = ucase(trim(ts.readline))
    If instr(data,"MAC ADDRESS") Then
       macaddress = trim(split(data,"=")(1))
       Exit Do
    End If
 loop
 ts.close
 Set ts = nothing
 fso.deletefile "c:\" & strIP & ".txt"
 Set fso = nothing
 GetMACAddress = macaddress
End Function 
%>
<HTML>
<HEAD>
<TITLE>Say Hello To the MAC MAN</TITLE>
</HEAD>
<BODY>
<%Response.Write("Your IP is : " & strIP & "<BR>" & vbcrlf)%>
<%Response.Write("Your MAC is : " & strMac & vbcrlf)%>
</BODY>
</HTML>



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

sexta-feira, 6 de abril de 2001

0

Checagem de patches instalados no IIS

Postado no news://uol.mundodigital.linguagens.asp por Wintermute:


Será que você tem todos os patches do IIS5 instalados?
Você provavelmente terá uma surpresa quando rodar esse utilitário: http://www.microsoft.com/Downloads/Release.asp?ReleaseID=24168

Baixe o arquivo, extraia para um diretório qualquer e rode o programa hfcheck.wsf em uma janela do dos...

se você usa w2k professional, então vai ter que editar esse programa e procurar pela string 'function IsServer(strMachine)', e alterar o return false por return true...

Isso porque a ferramenta originalmente foi desenhada para rodar apenas em w2k server, mas agente deu um jeitinho para rodar no professional



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

terça-feira, 3 de abril de 2001

1

"Falha na linguagem ASP abre dados de sites"

Foi veiculado recentemente no FolhaOnline (http://www.uol.com.br/folha/informatica/ult124u5239.shl) que "uma falha na programação da linguagem ASP, utilizada no sistema de segurança de alguns sites de vendas pela internet, permite que um internauta mal-intencionado invada bancos de dados e consiga qualquer informação sobre seus clientes, inclusive o número de seus cartões de crédito."


Antes de mais nada, o ASP não é uma linguagem de programação. O Microsoft Active Server Pages é "um ambiente server-side de scripts, que pode ser usado para criar e executar aplicações para web dinâmicas". Neste ambiente diversas linguagens de script podem ser utilizadas, tais como o VBScript e JScript (não confunda com o JavaScript, que roda no browser "cliente").


Como está aumentando o número de desenvolvedores alarmados com este "problema", resolvi explicar como ele funciona e como consertar este erro que é meramente de programação - não deixando assim de ser menos perigoso. Exemplificarei com uma rotina simples de login.


Eu tenho este problema ?
Para fazer o teste, coloque em todos os seus campos de formulário o valor ' (aspa simples). Se for retornado um erro do SQL como o abaixo, você possui o problema:


Microsoft OLE DB Provider for ODBC Drivers erro '80040e14'
[Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe na expressão de consulta 'campo=''''.
/pagina.asp, line 25

Como funciona o problema ?
O problema começa com um formulário que envia informações para o servidor web:


<form action="login.asp" method="post">
 Nome: <input type="text" name="nome"><br>
 Senha: <input type="password" name="senha">
</form>


Na página login.asp, é comum existir um código semelhante a este:


<%
set conexao = Server.CreateObject( "ADODB.Connection")
'... código para abrir a conexão ...'
set recordset = conexao.execute( "select * from usuarios where usuario='" & request.form("nome") & "' and senha='" & request.form("senha") & "'" )
if recordset.eof then   'Nao encontrou ningúem
   response.redirect "index.asp"
else
   'código para setar que o usuário existe
   'geralmente é algo como:
   session("logado") = true
end if
%>


No código destacado é que mora o perigo. Note o que você está fazendo: concatenando (juntando) uma string com outra. O que aconteceria se o usuário colocasse como nome "d'angelo" ? O processamento do SQL iria apontar um erro informando que o comando SQL está mal-formado. E aqui reside a falha. Um usuário mal-intensionado poderia aproveitar essa sua "distração" e acrescentar o seu próprio código SQL, que poderia modificar registros, apagar tabelas, listar dados sensíveis, etc.


Como eu conserto ?
Nosso colaborador Mário César Mancinelli de Araújo postou uma função que resolve o problema da aspa simples no artigo "Função que resolve o problema das aspas simples nas strings de SQL" (leia também os artigos relacionados: "Código simples de login de usuários" e "Pesquisa com acentuação"). Basicamente a rotina consiste na duplicação da aspa simples, que faz com que o SQL a interprete corretamente. Não se preocupe: o SQL irá consultar apenas uma aspa no banco de dados.


O código corrigido ficaria algo como:
...
set recordset = conexao.execute( "select * from usuarios where usuario='" & plic( request.form("nome") ) & "' and senha='" & plic( request.form("senha") ) & "'" )
...


Nota: Essa função deverá ser usada em quaisquer concatenações de strings que gere código SQL (inclusão de dados, pesquisas no site, etc) e não apenas na rotina de login.


Para não gerar o false senso de segurança, o IIS e o PWS (servidores web) possuem sim falhas de segurança que podem comprometer dados, mas a Microsoft periodicamente disponibiliza no endereço http://www.microsoft.com/technet/security/current.asp os HotFixes para os furos de segurança tão rápido ela os detecte e corrija. Os administradores dos servidores (geralmente) checam este endereço regularmente e estão aptos a aplicarem os patches no servidor. Assim, só fica vulnerável quem quer.



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...