quinta-feira, 28 de fevereiro de 2002

1

Recuperando páginas com conteúdo acentuado via XMLHTTP

Esse problema costuma aparecer periodicamente no news: como fazer para recuperar o conteúdo de uma página via XMLHTTP sem perder os caracteres acentuados ? O comportamento que é reportado se dá por conta de como os dados são transmitidos via XMLHTTP. Quando uma solicitação é feita, é aberta uma conexão com a página em questão e o conteúdo dela é retornado como uma sequência Unicode, onde cada caracter é representado em dois bytes. "Que disperdício!", você poderia pensar, mas se pensarmos que o ASCII permite representar 256 caracteres, a tabela Unicode nos permite representar 65536 caracteres (256^2), o que é muito mais interessante na Web, onde diversos idiomas coexistem e nos abre a possibilidade de explorar o potencial de internacionalização de documentos.


Voltando ao ponto, se há uma indicação que os dados que estão sendo transmitidos são XML (em outras palavras, se o Content-Type está setado para text/xml), a propriedade responseXML do XMLHTTP interpreta o encoding do documento e, caso o conteúdo do mesmo esteja bem formado, retorna o resultado na forma de um objeto DOMDocument. Caso não esteja bem formado, ou não se trate de um documento XML, o XMLHTTP vai assumir que o documento está codificado em UTF-8 e a propriedade responseText vai retornar algo esquisito: os acentos são substituídos por um ponto de interrogação e a próxima letra é perdida. Isso aconteceu na tentativa de transformar os caracteres recebidos (Unicode) para ASCII, representável no seu computador.


A "brilhante" conclusão que chegamos até aqui é que, caso estejamos transmitindo um documento XML, basta definirmos qual o encoding que está sendo utilizado (usando a famosa processing instruction <?xml version="1.0" encoding="ISO-8859-1"?> ) e que, para documentos codificados em UTF-8, as coisas funcionam bem. Isso exclui os documentos escritos em português, por exemplo, pois os caracteres acentuados fazem parte do ISO-8859-1, excedendo o UTF-8.


Isso não significa que é impossível. Há outras formas de acessar o conteúdo recebido do XMLHTTP. São elas:


- responseStream
- responseBody


A primeira, sinceramente, não consegui fazer funcionar. Mas fatalmente cairia na necessidade de algum objeto ADODB para fazer a conversão, como o Recordset ou Stream.


Já o responseBody, foi bastante útil. Segundo a documentação da Microsoft "... representa como resposta a entidade body como uma array de unsigned bytes (...) Contém os bytes não decodificados, da forma que foram recebidos pelo servidor." lembrei-me então de uma rotina que acompanha o código de upload sem componentes, que faz exatamente esse tipo de conversão. Juntando as idéias, fiquei com o código abaixo:

<%
set oXMLHTTP = Server.CreateObject("Microsoft.XMLHTTP")
oXMLHTTP.open "GET", "
http://localhost/conteudo.asp", false
oXMLHTTP.send
response.write "<xmp>" & oXMLHTTP.getAllResponseHeaders & "</xmp>" & _
    oXMLHTTP.responseText & "<br />" & _
    BinaryToString( oXMLHTTP.responseBody ) & "<br />"
'Baseado no código de Philippe Collignon (PhCollignon@email.com)
Function BinaryToString(strBinary)
 Dim intCount
 BinaryToString =""
 For intCount = 1 to LenB(strBinary)
 BinaryToString = BinaryToString & chr(AscB(MidB(strBinary,intCount,1)))
 Next
End Function
%>

Pesquisando mais um pouco, descobri que o código da BinaryToString pode ser otimizado. Ao invés de chamá-la, deveriamos substituí-la pela RSBinaryToString, desenvolvida por Antonin Foller @ PStruh, cujo fonte segue abaixo:

<%
Function RSBinaryToString(xBinary)
  Dim Binary
  If VarType(xBinary)=8 Then Binary = MultiByteToBinary(xBinary) Else Binary = xBinary
  Dim RS, LBinary
  Const adLongVarChar = 201
  Set RS = CreateObject("ADODB.Recordset")
  LBinary = LenB(Binary)
  If LBinary>0 Then
    RS.Fields.Append "mBinary", adLongVarChar, LBinary
    RS.Open
    RS.AddNew
      RS("mBinary").AppendChunk Binary
    RS.Update
    RSBinaryToString = RS("mBinary")
 Set RS=Nothing
  Else
    RSBinaryToString = ""
  End If
  Set RS=Nothing
End Function
 
Function MultiByteToBinary(MultiByte)
  Dim RS, LMultiByte, Binary
  Const adLongVarBinary = 205
  Set RS = CreateObject("ADODB.Recordset")
  LMultiByte = LenB(MultiByte)
  If LMultiByte>0 Then
    RS.Fields.Append "mBinary", adLongVarBinary, LMultiByte
    RS.Open
    RS.AddNew
    RS("mBinary").AppendChunk MultiByte & ChrB(0)
    RS.Update
    Binary = RS("mBinary").GetChunk(LMultiByte)
  End If
  Set RS = Nothing
  MultiByteToBinary = Binary
End Function
%>
Finalmente, a página conteudo.asp contém o seguinte código:
<%
'Evitar que as páginas sejam mantidas em cache
Response.AddHeader "Pragma", "No-Cache"
Response.CacheControl = "private"
Response.AddHeader "cache-control", "private"
Response.Expires = -1
Response.ExpiresAbsolute=#Jan 01,1990 00:00:01#
Response.Buffer = False
%>
áéíóú<%= timer %>àèìòù
.

Desta forma, os caracteres são convertidos para uma sequência digesta, permitindo que o conteúdo possa ser acessado em toda sua riqueza. Em outras palavras, os acentos são retornados corretamente.


Divirta-se!



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...

domingo, 24 de fevereiro de 2002

0

Logando Através do IP!

Para saber quantas pessoas entraram em um site é so fazer um contador certo!, mais como saber quantas vezes um so user entrou no meu site?


é so logar o ip desse user e da um update somando +1 a quantidade, segue abaixo os comando bem comentados para você colocar em seu site.


vamos utilizar 3 coisas, 1º) um Banco de dados 2º) a pagina que conterar os comando de inserir e atualizar 3º) a .asp que você vai ver os dados que estão no banco.


começando.


nesse exemplo utilizaremos DSN muitos outros chamam de ALIAS mais você pode fazer sem utilizar esse recurso. colocando esse comando na linha 3 do comando. provider=microsoft.jet.oledb.4.0; data source="& server.mappath("bd1.MDB") aqui o banco está com o nome bd1.mdb mais você pode colocar qualquer outro.


bem, agora vamos para o comando.


<%
abrindo a conexao com o BD atraves de DSN(ALIAS):
set conexao = server.createobject("ADODB.CONNECTION")
conexao.open "teste"

Verificando se o ip do user visitante não existe no BD:

view1 = "select * from logando where ip ='" & request.serverVariables("REMOTE_ADDR")&"'"
set view = conexao.execute(view1)

Caso não exista ele vai inserir o IP so user visitante
if view.eof then
insert = "insert into logando (ip, vezes) values ('"& request.serverVariables("REMOTE_ADDR") &"','1')"
set insertindo = conexao.execute(insert)


Caso não seja a primeita ves que ele esta visitando o site
ele vai so aumentar a quatidade de vezes que ele visita o site.
else
do while not view.eof
view2 = "select * from logando where ip ='" & request.serverVariables("REMOTE_ADDR")&"'"
set bu = conexao.execute(view2)
exit do
loop
update = "update logando set vezes = '"& bu("vezes") + 1 &"' where ip ='" & request.serverVariables("REMOTE_ADDR")&"'"
set updateando = conexao.execute(update)
end if
%>


para ver seus dados somente de um selct na tabela.


<%
set conexao = server.createobject("ADODB.CONNECTION")
conexao.open "teste"
sql = "select * from logando"
set olhar = conexao.execute(sql)
Do while not olhar.eof
 response.write "IP:&nbsp"&olhar("ip")
 response.write "<br>"
 response.write "Quantidade de vezes:&nbsp"&olhar("vezes")
 response.write "<br><br>"


 olhar.Movenext
Loop


%>


bom aproveito do comando



Esta matéria foi postada originalmente no ASP4Developers por Dieggo Phillippe (site), que na época era "Programador de ASP/HTML e visitem também
http://www.avanielmarinho.com.br, http://www.afolhanet.com.br/delivery, http://www.afolhanet.com.br e http://www.feiraodocarro.com.br". Hoje, vai saber...

sexta-feira, 22 de fevereiro de 2002

0

XML + Data Binding = Menos trabalho

Seguindo a linha do artigo anterior, podemos ligar alguns controle diretamente à elementos de um data island XML. Mas quem disse que esses elementos precisam ser read-only ?


No artigo anterior, colocamos um exemplo de uma hipotética listagem de nomes e telefones, indicando uma possível alternativa à criação de cada linha da tebla individualmente. Se você ainda não leu, leia antes de continuar este.


Caso precisássemos alterar os dados da tal lista, fatalmente cairíamos em um código como o abaixo:

<%
'...
response.write "<form method=""post"">"
response.write "<table>"
do while not rs.eof
   response.write " <tr><td>"
   'Criar um campo hidden com o ID, e dois campos: um para o nome e outro para o telefone
   response.write "<input name=""id_" & rs("id") & """ type=""hidden"" value=""" & rs("id") & """ />"
   response.write "<input name=""nome_" & rs("id") & """ type=""text"" value=""" & rs("nome") & """ />"
   response.write "</td><td>"
   response.write "<input name=""tel_" & rs("id") & """ type=""text"" value=""" & rs("telefone") & """ />"
   response.write "</td></tr>"
   rs.MoveNext
loop
response.write " <tr><td colspan=""2""><input type=""submit"" /></td></tr>"
response.write "</table>"
response.write "</form>"
%>

Como ficaria o código de leitura dos campos, quando este FORM fosse enviado ? Provavelmente teríamos um loop entre todos os itens da collection Request.Form. Se tivéssemos o azar de ter diversos campos, com características diferentes, seria um pouco mais problemático. Mas, como seria com data binding ?


Tomando como base a mesma rotina de criação de XML do artigo anterior, só precisariámos do seguinte:

<%
'... conexão do banco de dados e construção do documento XML
%>
<xml id="dsoLista"><%= oXMLDoc.xml %></xml>
<table datasrc="#dsoLista">
 <tr>
  <td><input type="text" datafld="nome" /></td>
  <td><input type="text" datafld="tel" /></td>
 </tr>
</table>
<xmp id="listagemXML"></xmp>

Tão logo um elemento seja alterado, o valor correspondente reflete tal alteração. Duvida ? Então acrescente o código:

<SCRIPT FOR="dsoLista" EVENT="oncellchange">
// Precisamos da pausa, pois quando este evento é disparado, a fonte de dados ainda não foi alterada
setTimeout( "listagemXML.innerText = dsoLista.xml", 50 )
</SCRIPT>

Caso você monte um documento pequeno, verá as mudanças acontecendo.


"Mas, e o ID ?"
Calma, para entender o por quê não colocamos referências ao ID, devemos entender o que está acontecendo. Estamos ligando controles a elementos de um data island (ou seja, fazendo um "data binding"). Quando alteramos um elemento, essa alteração automaticamente se reflete no data island. Então, da forma como estruturamos o XML, é desnecessário saber qual o ID. Eventualmente, poderíamos criar um elemento que representasse o estado de um registro, se ele foi alterado ou não. Aí as coisas ficam mais claras no ASP.


"Quais os elementos que suportam data binding ?" (Ctrl-C, Ctrl-V so site da MS)







































































































ElementUpdatableRenders HTMLBound Property
AFalseFalsehref
APPLETTrueFalseproperty value via PARAM
BUTTONFalseTrueinnerText, innerHTML
DIVFalseTrueinnerText, innerHTML
FRAMEFalseFalsesrc
IFRAMEFalseFalsesrc
IMGFalseFalsesrc
INPUT TYPE=BUTTONFalseTrueinnerText, innerHTML
INPUT TYPE=CHECKBOXTrueFalsechecked
INPUT TYPE=HIDDENTrueFalsevalue
INPUT TYPE=PASSWORDTrueFalsevalue
INPUT TYPE=RADIOTrueFalsechecked
INPUT TYPE=TEXTTrueFalsevalue
LABELFalseTrueinnerText, innerHTML
LEGENDFalseTrueinnerText, innerHTML
MARQUEEFalseTrueinnerText, innerHTML
SELECTTrueFalseobj.options(obj.selectedIndex).text
SPANFalseTrueinnerText, innerHTML
TEXTAREATrueFalsevalue

"Que vantagem Maria leva ?"
Bom, tendo um documento XML, as coisas são mais simples de pesquisar. Vamos supor que você precise consistir os dados entrados novamente no servidor (e sabemos o quanto isso é frequente). Você poderia pesquisar relacionamentos entre os dados do documento XML, ou caso queira sofisticar, criar um documento XML Schema que contenha as regras de como validar os dados e, com uma linha de código, eles seriam verificados, poupando código e deixando o mesmo mais simples de sofrer alterações (essas seriam feitas em apenas um lugar).


"Mas, eu vou precisar gerar um documento XML sempre ?"
Hummmm, mais ou menos. Quando pensamos em aplicações em n-tiers, há uma ampla gama de possibilidades retornadas pelo middle-tier para o ASP (o componente retorna informações que são tratadas no ASP). Por que não retornar as informações como uma string XML ? Pelo fato de estarmos utilizando um tipo de dado simples, a própria comunicação com o componente seria mais rápida e evitaríamos os problemas de tipagem de dados. Criando um middle-tier que retorna dados em formato XML, tornamos possível a reutilização deste código, uma vez que a base de aplicações que suporta XML não pára de crescer. Assim, em última análise, sempre deveríamos ter a transmissão de dados em um formato padrão, e, mais padrão que XML é difícil.. :)


"Ok, engraçadinho! E como fazer a aleteração dos dados ?"
Há duas possibilidades: a primeira é, no evento onsubmit do formulário que será retornado ao servidor, alimentarmos um elemento TEXTAREA com os dados do Data Island e reconstruirmos o objeto no servidor. Uma segunda, envolve os conceitos discutidos no artigo "Transferência de dados com XML + ASP", quando usamos o XMLHTTP para fazer a transferência do próprio objeto. A segunda é mais comum nas aplicações que desenvolvi recentemente, pois contamos com uma vantagem: a ausência de refresh. Podemos, desta forma, postar um conteúdo para o servidor, deixar que ele processe e aguardar uma resposta, indicando o status da operação, sem sair da página. Interessante, não ?


Por hoje é só pe-pessoal. Divirtam-se :)



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

Ah sim, Data Islands!

Outro recurso interessante do IE, disponível desde a versão 4, é a possibilidade de ligar elementos HTML a uma fonte de dados baseada em XML, as famosas (?) data islands, ou "ilhas de dados". A idéia é enviar uma pequena quantidade de dados para o client e permitir que estes sejam processados por lá mesmo.


Para entender melhor, consideremos o seguinte exemplo: Você possui uma lista de nomes e telefones e deseja mostrá-la para o usuário. Sem grandes novelas, você faria algo do tipo:

<%
'Conexão com o banco de dados
set rs = conn.execute( "select id, nome, telefone from tabela" )
response.write "<table>"
do while not rs.eof
   response.write " <tr><td>" & rs("nome") & "</td><td>" & rs("telefone") & "</td></tr>"
   rs.MoveNext
loop
response.write "</table>"
%>

Qual o problema com esse código ? Nenhum, para falar a verdade. Mas, caso seja necessária a alteração dos mesmos dados, teremos um pouco mais de trabalho. Esse ponto vamos abordar em outra matéria: no momento, vamos nos ater apenas à fonte de dados. Ao invés de "chumbar" os dados na tabela, poderíamos fazer assim:

<%
'Conexão com o banco de dados
set rs = conn.execute( "select id, nome, telefone from tabela" )
set oXMLDoc = Server.CreateObject("MSXML2.DOMDocument")
oXMLDoc.async = false
set oRoot = oXMLDoc.createElement("lista")
do while not rs.eof
   set oItem = oXMLDoc.createElement("i")
   set oID = oXMLDoc.createElement("id")
   oID.text = rs("id")
   oItem.appendChild oID
  
   set oNome = oXMLDoc.createElement("nome")
   oNome.text = rs("nome")
   oItem.appendChild oNome
  
   set oFone = oXMLDoc.createElement("tel")
   oFone.text = rs("telefone")
   oItem.appendChild oFone
   oRoot.appendChild oItem
   set oID   = nothing
   set oItem = nothing
   set oNome = nothing
   set oFone = nothing
   rs.MoveNext
loop
oXMLDoc.appendChild oRoot
%>
<xml id="dsoLista"><%= oXMLDoc.xml %></xml>
<table datasrc="#dsoLista">
 <tr>
  <td><span datafld="nome"></span></td>
  <td><span datafld="telefone"></span></td>
 </tr>
</table>

"Qual a diferença ?"
A diferença é que ligamos a tabela à uma fonte de dados XML, e depois dois elementos SPAN aos "campos" desta fonte. Isso possibilitou ao browser mostrar a tabela inteira, sem que tivéssemos a necessidade de escrever cada linha da tabela, pois ele entendeu que cada elemento "i" era um registro.  É importante notarmos que criamos um objeto DOMDocument, que é uma instância de um documento XML, cujo conteúdo criamos dinamicamente, baseado no recordset. Piece of cake!


"Que vantagem Maria leva ?"
Que tal a possibilidade de manipular esses dados no client ? Poderíamos fazer:

<SCRIPT>
function Primeirao(){
 alert( dsoLista.selectSingleNode("//nome") + " é o primeirão da lista" )
}
</SCRIPT>
<input type="button" onclick="Primeirao()" value="Quem é o primeiro da lista ?" />

É muito importante frisar que essa possibilidade de ligar controles à elementos de um documento XML contido em um Data Island é viável de ser implementado quando o volume de dados não é montruoso e quando podemos garantir que o client seja IE, como, por exemplo, em ambientes de intranets/extranets. Para aplicações comerciais na internet, tome cuidado com a implantação deste recurso, pois ele será solenemente ignorado em outros browsers.


Não deixe de ler a continuação desta saga, onde veremos como podemos aproveitar melhor os recursos de data binding.



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...

quinta-feira, 21 de fevereiro de 2002

0

funções de linha única. P2.

Bem pessoal, voltei, coisa rapida né!?
Não pensem que não tenho nada pra fazer...


Problema é que eu curto muito estudar coisas relacionadas a bancos de dados,
sendo assim queria passar um pouco desse conhecimento e outra, como eu quero
me certificar em Oracle (DBA) e parar de programar eu tento ajudar ao maximo
as pessoas pois é assim que se aprende... Ensinando aprendemos.


Vejamos, as funções numericas de única linha são bem uteis quando trabalhamos
algumas contas matematicas que precisamos de valores inteiros.


Lista de funções:


ROUND(Coluna,n) - Arredonda valor para determinado decimal
TRUNC(Colunam,n) - Trunca o valor para um determinado decimal tb
MOD(m,n) - Retorna o resto de uma divisão m por n


Exemplos:
SELECT ROUND(567.283,2) Round1, ROUND(567.283,0) Round2, ROUND(567.283,-1) Round3 from dual


   ROUND1     ROUND2     ROUND3
--------- ---------- ----------
   567.28        567        570


TRUNC
SELECT TRUNC(567.283,2) TRUNC1, TRUNC(567.283,0) TRUNC2, TRUNC(567.283,-1) TRUNC3 from dual


TRUNC1     TRUNC2     TRUNC3
------ ---------- ----------
567.28        567        560


MOD
SELECT MOD(10,5) Mod1, MOD(10,3) Mod2,  MOD(10,4) Mod3 from dual


      MOD1       MOD2       MOD3
---------- ---------- ----------
         0          1          2



Bem, basicamente essas são as numericas importantes...
PS: Virão o apelido que eu falei no artigo passado ?
Select funcao(coluna) APELIDO from tabela 
Fica tudo mais claro né!!!
PS2: Para quem não conheçe o conceito, a tabela DUAL é uma tabela do Oracle (ficticia)
usada para testes de funções.


Falows



Esta matéria foi postada originalmente no ASP4Developers por Allan Torres (site), que na época era "Analista de sistemas, trabalho com ASP, Oracle, PHP, C, Ferramentas Case e estudo Eng. Elétrica. Sempre as ordens! ]:)". Hoje, vai saber...

0

funções de linha única.

Pessoal, tudo bem?
Vamos lá, alguem sabe o que é uma função de uma única linha ?
Bem, isso é bastante usado no oracle para formatar dados de saida, muito bom mesmo, é ajuda a vida quando trabalhamos com mascaras.


A sintaxe é bem facil:
function_name (coluna/expressão, [arg1, arg2,...])


bem, vou dar alguns exemplos simples disso:


Uma lista de funções:
Lower(coluna) - Converte os caracteres para letras minusculas
upper(coluba) - converte os dados para letras maiusculas
Initcap(coluna) - Serve para colocar a 1º letra em maiusculas
SubStr(coluna,m,n) - Serve para retornar um pedaço da string
Length(coluna) - Retorna o numero de caracteres da string
inStr(coluna,m) - Retorna a posição numerica do caractere nomeado
Trim(coluna) - Essa é bom, tira os espaços em brando nas laterais


Exemplos:


lower:
select lower(table_name) from all_tables


LOWER(TABLE_NAME)
------------------------------
tb_endereco_comprador
tb_notificacao
tb_origem_produto
tb_periodo
tb_periodo_extra
tb_responsavel_balanco_mensal



UPPER
select UPPER(table_name) from all_tables


UPPER(TABLE_NAME)
------------------------------
TB_ENDERECO_COMPRADOR
TB_NOTIFICACAO
TB_ORIGEM_PRODUTO
TB_PERIODO
TB_PERIODO_EXTRA
TB_RESPONSAVEL_BALANCO_MENSAL


 


INITCAP
select InitCap(table_name) from all_tables


INITCAP(TABLE_NAME)
------------------------------
Tb_Endereco_Comprador
Tb_Notificacao
Tb_Origem_Produto
Tb_Periodo
Tb_Periodo_Extra
Tb_Responsavel_Balanco_Mensal


 


SUBSTR
select SubStr(table_name,0,8) from all_tables


SUBSTR(T
--------
TB_ENDER
TB_NOTIF
TB_ORIGE
TB_PERIO
TB_PERIO
TB_RESPO


 


LENGTH
select LENGTH(table_name) from all_tables

LENGTH(TABLE_NAME)
------------------
                21
                14
                17
                10
                16
                29


INSTR
select INSTR(table_name,'A') from all_tables

INSTR(TABLE_NAME,'A')
---------------------
                   18
                   11
                    0
                    0
                   16


TRIM
select TRIM(table_name) from all_tables
TRIM(TABLE_NAME)
------------------------------
TB_ENDERECO_COMPRADOR
TB_NOTIFICACAO
TB_ORIGEM_PRODUTO
TB_PERIODO
TB_PERIODO_EXTRA
TB_RESPONSAVEL_BALANCO_MENSAL


Bem, essas são as de tratamento de String, proxima vez eu mando as numericas...


FalowS!
PS: Para não ficar esse cabeçalho feio é só colocar:
Select função(coluna) Apelido From tabela
Dar um apelido a expressão! !



Esta matéria foi postada originalmente no ASP4Developers por Allan Torres (site), que na época era "Analista de sistemas, trabalho com ASP, Oracle, PHP, C, Ferramentas Case e estudo Eng. Elétrica. Sempre as ordens! ]:)". Hoje, vai saber...

0

Checkbox com mesmo name vira Collection em pagina ASP

Imagine que vc deseja criar uma lista de itens para um usuário selecioná-los. Voce pode usar checkboxes em uma página ASP, todos do mesmo grupo, ou seja com o mesmo nome na tag name. Bem, o problema seria saber qual foi selecionado ou não.


Após um submit para uma página ASP, os checkboxes se tornam uma collection, contendo somente os elementos que foram selecionados (ticados). Para acessá-los, vc pode utilizar o loop For...Each. O valor de cada item será o que foi armazenado na tag value de cada checkbox correspondente, e vc recupera usando a propriedade .value.



Esta matéria foi postada originalmente no ASP4Developers por Valmir Cinquini (site), que na época era "Analista/Programador C#, VB.Net, ASP, VB, Javascript e T-SQL

www.cinquini.com.br/vcinquini>". Hoje, vai saber...

0

Estudo inicial do SQL


Como programadores não podemos esquecer que SQL é uma realidade para nós, então, aqui tem uma tabelinha que ajuda muito na hora de aprender mais sobre SQL.
PS: Ela é baseada no Oracle (Melhor banco do mundo, na minha opnião) :)


 





















InstruçõesDescrição
SELECTRecupera dados do banco de dados
INSERT
UPDATE
DELETE
São conhecidos como comandos de DML : Data Manipulation Languege, sendo assim, como já diz o nome ele manipula dados. e as instruções respectivamente servem para: Incluir dados; Atualizar dados e deletar dados.
CREATE
ALTER
DROP
RENAME
TRUNCATE
Comandos conhecidos como DDL: Data Definition Language, Configuram, alteram, removem, renomeiam estruturas do banco de dados como tabelas, sequences, procedures e outros.
COMMIT
ROLLBACK
SAVEPOINT
Comandos que gerenciam as instruções de DML, são usados com os conseitos de transações.
GRANT
REVOKE
Comandos de DCL: Data control Language, controlam acesso as objetos do banco como tabelas, permissões e outros.


Esta matéria foi postada originalmente no ASP4Developers por Allan Torres (site), que na época era "Analista de sistemas, trabalho com ASP, Oracle, PHP, C, Ferramentas Case e estudo Eng. Elétrica. Sempre as ordens! ]:)". Hoje, vai saber...

quarta-feira, 20 de fevereiro de 2002

0

Como criar um banco de dados do Access (MDB) vazio

Basta usar o ADOX (Active Data Objects eXtended) para executar esta tarefa:

<%
sNovoBanco = server.Mappath("NovoMDB.MDB")
Set oNovoBanco = CreateObject("ADOX.Catalog")
oNovoBanco.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNovoBanco
Set oNovoBanco = Nothing
%>

Vale lembrar que também é possível criar tabelas, campos, índices e afins via ADOX.



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

Como pegar um registro aleatório de uma tabela

(Retirado de ASPFAQS.com, #2132)

Usando SQL Server 7 no Windows 2000:
SELECT TOP 1 campo FROM tabela ORDER By NewID()
Sem Windows 2000 e caso a tabela tenha um campo IDENTITY:
SELECT TOP 1 campo FROM tabela ORDER BY RAND((1000*CampoID)*DATEPART(millisecond, GETDATE()))

No caso do Access ou SQl Server 6.5, não tem jeito: precisamos saber quantos registros existem e fazer a randomização no ASP. O Blade postou um artigo sobre isso.



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

Como colocar um ícone na barra de endereços do browser

Não é uma questão diretamente ligada ao ASP, mas, raios, como colocamos um ícone na barra de endereços do IE5 ou superior ?


Para fazer esse "detalhe" funcionar, você vai precisar de um editor de ícones. *NAO É UM .GIF RENOMEADO PARA .ICO!* Use o MicroAngelo ou qualquer outro software do gênero. Uma lista bem extensa de softwares pode ser encontrada no Tucows. Este ícone *precisa* ter 16x16 pixels e ser armazenado no diretório principal do seu *domínio*, com o nome de "favicon.ico" (sem as aspas, lógico :)


Caso você não tenha acesso a esta pasta, ou queira colocar o ícone em outro lugar, ou com outro nome, você ainda tem a opção de usar uma tag LINK, que vai produzir o mesmo efeito:

<link rel="SHORTCUT ICON" href="http://www.asp4developers.com.br/imagens/asp4d.ico" />

Vale ressaltar que essa funcionalidade só está disponível para o IE5 ou superior.



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

Mostra campos recebidos de um formulário.

Essa função é bem boba porém ajuda muito quando temos um formulário de entrada de dados muito grande, onde precisamos saber quais os nomes dos campos sem precisar olhar no código.


'#Escreve informações recebidas do formulario
dim i
Sub EscreveForms
For Each i In Request.Form Response.Write i & ":" &  Request.Form(i)
Response.Write("<br>")
Next
End Sub


Depois basta chamar no seu código a Sub.
EscreveForms



Esta matéria foi postada originalmente no ASP4Developers por Allan Torres (site), que na época era "Analista de sistemas, trabalho com ASP, Oracle, PHP, C, Ferramentas Case e estudo Eng. Elétrica. Sempre as ordens! ]:)". Hoje, vai saber...

0

Olá DHTML Behaviors, muito prazer!

Introduzido a partir do IE5.5, e, segundo a própria documentação, "...uma das novidades mais excitantes...", DHTML Behaviors são pequenos códigos associados a elementos do HTML, que estendem sua funcionalidade, implementando recursos não existentes por default.


A Microsoft já implementou alguns behaviors, como o userData que permite persistir dados no client até o limite de 10240kb (ou 10 Megabytes, se preferir) em cenários de intranets, ou, no pior dos casos, 64kb por página para sites restritos, o que, convenhamos, é muito maior que qualquer cookie que conhecemos. Está mais para "torta" que para "biscoito" (ok, piada infame).


Uma forma de implementar novos behaviors é utilizar HTC. HTCs (HTML Components) nos permitem encapsular em um arquivo .htc a lógica necessária para fazermos as manipulações DHTML que nossa aplicação necessita, usando linguagens de scripting bastante conhecidas. Complicado ? Não, não é, e pretendo mostrar neste artigo como podemos montar um pequeno HTC para validarmos dados entrados pelos usuários.


Antes de adentrarmos em código, vamos entender a necessidade de usarmos HTCs:
Você desenvolve uma página, que precisa que fazer uma verificação em um campo, para ver se o que foi digitado é um número maior ou igual que zero e menor ou igual que 100. Um código inicial hipotético seria:


<input id="qtdade" name="qtdade" type="text" onblur="if( isNaN(this.value) || parseInt(this.value,10) < 0 || parseInt(this.value,10) > 100 ) this.value='0'" />


"Viscoso, mas gostoso". Pode não ser o mais belo dos códigos, mas funciona. Depois de um tempo, há a inclusão de outro campo, que precisa ser validado da mesma forma. Sem problemas! Você faria assim:


<script>
function Validar(objeto){
 if( isNaN(objeto.value) || parseInt(objeto.value,10) < 0 || parseInt(objeto.value,10) > 100 ) objeto.value='0';
}
</script>
<input id="qtdade" size="5" maxlength="3" onblur="Validar(this)" />
<input id="outro" type="text" size="5" maxlength="3" onblur="Validar(this)" />


E viva! O código continua funcionando, com a diferença que você modularizou, de certa forma, a funcionalidade da validação. Se eu tiver "n" elementos na mesma página, é só chamar a tal função.


Claro, você entendeu o próximo passo: em uma outra página, a mesma funcionalidade é necessária, mas a faixa de valores permitidos é de 18 a 75 (tipo um campo para a idade). Sem muito tempo, você copia a rotina para a outra página, e adapta-a. E já temos um problema.


Temos um código que não é genérico o suficiente e que precisa ser repetido em diversos lugares, por conta das pequenas peculiaridades. Se houvesse o pedido que letras nunca deveriam ser digitadas (e não excluídas após o campo perder o foco), você teria o trabalho de alterar todas as páginas, prevendo as devidas manipulações anexadas ao evento onkeypress. Putz!


Os DHTML Behaviors, implementados via HTCs, podem resolver este tipo de problema, por conta de suas facilidades:



  • Encapsulamento de código: significa que é possível criarmos pequenos módulos genéricos, que podem ser implementados em qualquer página com pouco/nenhum esforço, bastando fornecer os parâmetros que o código necessita. No caso hipotético acima, quando precisamos mudar uma função, apenas um lugar é alterado e esta mudança reflete nos demais elementos relacionados.

  • Facilidade de uso: Uma vez que é simples declararmos a utilização de um HTC, fica simples para outras pessoas envolvidas na construção de páginas acessar os mesmos recursos, usando apenas uma sintaxe declarativa. Já que o código está encapsulado no HTC, esses desenvolvedores não precisam saber como funciona o tal componente, mas apenas que, dado uma entrada, uma determinada saída é recebida (conceito de 'caixa preta')

  • Separação dos scripts do conteúdo: uma vez que você não precisa colocar código inline (declarado no próprio elemento HTML), é mais simples que qualquer pessoa altere o layout/design da página, sem influenciar muito no comportamento do código. Então a manutenção é mais simples, necessitando de menos tempo para executar eventuais consertos/alterações.

  • Simples de criar, leves na utilização: adivinhe o que é um arquivo HTC: um arquivo texto, onde podemos colocar código JavaScript/VBScript que manipula a nossa página. Só isso. Isso significa que, em uma primeira olhada, você já sabe montar HTCs, só não sabia que sabia :) Na prática, as coisas são um pouco diferentes, pois há alguns conceitos de programação não muito usados e um bocado de testes a fazer. Mas vale a pena. Opcionalmente, se você quiser criar behaviors compilados em VC++, também é possível, com a vantagem adicional de proteger o código fonte do behavior.

Ok, você já viu que pode ser útil, vamos à implementação. Antes de mais nada, associamos uma classe CSS a um documento HTC. A página HTML ficaria parecida com:


<style>
.Validar { behavior: url( validar.htc ) }
</style>
<script>
 function MsgErro(objeto){
 if( confirm( objeto.nErros + " erros já foram cometidos neste campo.\n" +
    "Deseja limpar este contador vergonhoso ?" ) ) objeto.ZerarErros();
 }
</script>
<input id="qtdade" class="Validar" size="5" maxlength="3" min="0" max="100" onTeclaInvalida="MsgErro(this)" />
<input id="idade" class="Validar" size="5" maxlength="3" min="18" max="75" onTeclaInvalida="MsgErro(this)" />


Pronto. O IE já vai entender que o arquivo validar.htc implementa alguma funcionalidade nos elementos que estão associados com a classe Validar. Se quiséssemos colocar um HTC específico a um elemento, poderíamos declará-lo na própria propriedade style. Enfim, é o CSS tal qual conhecemos, sem novidades.


Além disso, estamos implementando código para um evento chamado onTeclaInvalida, que espero que você saiba que não existe. Este evento será implementado pelo nosso HTC. Sem demora, vamos à construção do validar.htc. Abra o notepad e digite:



<METHOD   NAME="ZerarErros" />
<PROPERTY NAME="nErros" GET="nErros" />
<PROPERTY NAME="min" VALUE="0" />
<PROPERTY NAME="max" VALUE="0" />
<EVENT    NAME="onTeclaInvalida" ID="onTeclaInvalida" />
<ATTACH   EVENT="onblur"     HANDLER="ChecarDados" />
<ATTACH   EVENT="onkeypress" HANDLER="KeyPress" />


<SCRIPT LANGUAGE="javascript">
// Aqui vai o código
</SCRIPT>



Para demonstrar algumas das funcionalidades dos HTCs, vamos implementar:



  • A propriedade nErros, que retornará quantos erros de digitação o usuário cometeu.

  • As propriedades min e max, informando a faixa de valores válidos.

  • O método ZerarErros, responsável por zerar este contador

  • O evento TeclaInvalida, que será disparado quando o usuário digitar uma tecla inválida.

  • A captura do evento onBlur do elemento, formatando os números entrados (ex: 00001 -> 1 )

  • A captura do evento onKeyPress, não permitindo a entrada de caracters diferentes de números.

E já está de bom tamanho. Já temos complicações o suficiente. :) Dentro das tags SCRIPTs, vamos começar pela implementação da propriedade nErros. Podemos fazer:


QtdeErros = 0;
function nErros(){
 return( QtdeErros )
}


Apenas retornamos o valor de uma variável. Implementar o método ZerarErros não deve ser, então, tão complicado:


function ZerarErros(){
 QtdeErros = 0;
}


Ta-da! E agora você se pergunta: Cadê as coisas complicadas ? Sinto desapontá-lo, mas não há coisas muito complicadas na codificação de HTCs. :) Implementemos o tratamento para o evento onBlur:


function ChecarDados(){
 // Se for um número e estiver dentro do intervalo, formatá-lo.
 if( !isNaN(element.value) && element.value != "" ){
  min = parseFloat( element.min )
  max = parseFloat( element.max )
  numero = parseFloat( element.value )
  if( numero >= min && numero <= max ) element.value = numero;
  else element.value = "0";
 }
}


Note que aqui acessamos a propriedade value do elemento ao qual o behavior está associado, bem como as propriedades min e max que nós definimos. Da mesma forma, poderíamos acessar *qualquer* propriedade do objeto. Finalmente, o tratamento das teclas digitadas:


function KeyPress(){


 var keyCode=event.keyCode
 var char = String.fromCharCode(keyCode)


 // Verificamos se o usuário entrou com algo diferente de números, ponto ou vírgula.
 // Se sim, ignorar a tecla, incrementar contador e disparar o evento de TeclaInvalida
 if( isNaN( char ) && ".,".indexOf( char ) == -1 ){
  keyCode = 0;
  QtdeErros++;
  onTeclaInvalida.fire()
 }
 // Se foi digitada uma vírgula, trocar por um ponto (facilita operações com o JS)
 if( keyCode == 44 ) keyCode = 46;


 // Se foi digitado um ponto e já tinha um ponto, desconsiderar
 if( element.value.indexOf(".") != -1 && keyCode == 46 ) keyCode = 0;


 // Retornar o código filtrado
 event.keyCode = keyCode
}


Pronto. Salve o arquivo e execute a página, vendo o que implementamos. Note que a mensagem de erro poderia ser implementada dentro do HTC, mas não fizemos para manter a modularidade do código. Desta forma, apenas código genérico fica no HTC, permitindo que ele seja reutilizado em diversos lugares, sem gambiarras.


Algumas possibilidades para desenvolvimento de HTCs:



  • Validação de campos (caracteres válidos, números, datas, cpf, etc)

  • Desenho/manipulação de controles em tela (tabelas com scroll, mouseover/out em imagens,etc)

  • Aprender um pouco mais como programar orientado a eventos (event-driven programming)

Já estou desenvolvendo algumas coisas nesse sentido, e o resultado é bonito de se ver.


Espero que o texto tenha sido esclarecedor. Divirta-se!



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, 19 de fevereiro de 2002

0

Como exibir imagens armazenadas em campos BLOB/RAW/Long RAW

Como exibir imagens armazenadas em campos BLOB/RAW/Long RAW
Eis outra dúvida freqüente: como pegar uma imagem que foi armazenada em um campo BLOB (Binary Large Object) do SQL Server ou RAW/Long RAW do Oracle e exibí-la, usando o ASP ?
Antes de mais nada, vale a recomendação de sempre: se não é para copiarem, não coloque na Internet. O mecanismo abaixo pode ser interessante para deixar imagens "seguras", por poder ser incremnetado de forma a ser necessário um usuário/senha para poder visualizar a imagem, mas sempre vai ter um espírito de porco que vai repassar a senha dele para outros. Tenha isso em mente..
O segredo consiste em dizer ao browser que a página em questão não irá retornar um documento HTML, mas uma imagem  (em outras palavras, nao retornar um MIME Type 'text/html', mas um 'image/gif', 'image/jpeg', etc.) Observe o código abaixo, que exibe uma imagem JPEG, armazenada em um hipotético campo BLOB chamado "Imagem":


<%
'Imagem.asp


'Convém expirar o contéudo, de forma a desprezar o que houver em cache, no caso de imagens dinâmicas
Response.Expires = -1000
Response.ExpiresAbsolute = 0
Response.Buffer = true
Response.ContentType = "image/jpeg"
 
'Aqui entraria a rotina de conexão com o banco de dados


Response.BinaryWrite rs("Imagem")


'Nao esqueça de destruir os objetos criados


%>


E depois essa imagem seria exibida no HTML assim:


<img src="Imagem.asp" alt="uhu!" />


Mas vale ressaltar que, caso a necessidade seja construir suas próprias imagens, provavelmente para exibir gráficos dinâmicos, há ao menos quatro possibilidades:
1: Criar a imagem na mão, usando algum componente de terceiros (costumam ser caros)
2: Renderizar a imagem no lado do cliente, usando algum applet Java ou ActiveX (KavaChart ou Office Web Components, por exemplo)
3: Desenvolver um código que gere uma imagem SVG (o plug-in é pesado: cerca de 2.5Mb. IMHO, é a opção mais divertida)


Além disso, tem o lance do espaço necessário para armazenar essas imagens, o stress do banco de dados, enfim, a decisão final é sua. Divirta-se!



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...

sábado, 16 de fevereiro de 2002

0

Pesquisas no Knowledge Base da Microsoft

O Lula já tinha dado uma dica no site dele, quanto à pesquisa nos KB da MS (http://lula.pro.br/artigo.asp?codigo=309&autor=Lula). Outras páginas com informações bastante interessantes:


INFO: ASP Error Codes (Q294271)
INFO: ASP Knowledge Base Article Index (Q259383)
INFO: Getting Started with Active Server Pages (Q297943)
INFO: Use KBKeywords to Search for Languages Articles (Q117552)


Procure pesquuisar baseado em palavras chaves como kbInfo kbASP.. Suas pesquisas vão trazer mais resultados singinificativos.



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...

quarta-feira, 13 de fevereiro de 2002

0

Formatação de Links com ASP

Esta função é interessante se você quiser deixar que o usuário crie links e email para determinadas palavras. Não precisando deixar as tags html (própriamente ditas) a merce do usuário.
restringindo funções e trocando por outras de sua preferência:
----------------------------


utilizando as tags [k] e [/k] é possível linkar os texto conforme sua necessidade:
observe:


se digitar [k]guardiao@terra.com.br[/k]
o texto automáticamente se tornará um link para email


se digitar k]Palavra$www.site.com.br[/k]
o texto Palavra se tornará um link para http://www.site.com.br


se digitar [k]Cezinha$seunome@site.com.br[/k]
o texto Palavra se tornará um link para o email seunome@site.com.br


se digitar diretamente http://www.seusite.com.br
E já se tornará um link.
Só não pode ter um nada encostado junto do .br, caso contrário ele imagina que seja parte do endereço também.


Para quem quiser ver funcionando...
No meu site:
http://www.guardiaodaweb.com.br
No texto blog


-------------------
Function Linker(strInput)
Dim iCurrentLocation
Dim iLinkStart
Dim iLinkEnd
Dim strLinkText
Dim strOutput
iCurrentLocation = 1
Do While InStr(iCurrentLocation, strInput, "http://", 1) <> 0
iLinkStart = InStr(iCurrentLocation, strInput, "http://", 1)
iLinkEnd = InStr(iLinkStart, strInput, " ", 1)
If iLinkEnd = 0 Then iLinkEnd = Len(strInput) + 1


Select Case Mid(strInput, iLinkEnd - 1, 1)
Case ".", "!", "?"
iLinkEnd = iLinkEnd - 1
End Select

strOutput = strOutput & Mid(strInput, iCurrentLocation, iLinkStart - iCurrentLocation)
strLinkText = Mid(strInput, iLinkStart, iLinkEnd - iLinkStart)
finalUrl = LCase(right(strLinkText,4))

if finalUrl = ".gif" or finalUrl = ".jpg" then
strOutput = strOutput & "<IMG SRC='"& strLinkText &"' VSPACE='5' HSPACE='5' BORDER='0'>"
else
'strOutput = strOutput & "<A HREF=""" & strLinkText & """>" & strLinkText & "</A>"
strOutput = strOutput & "<A HREF=""" & strLinkText & """ target=""_blank"">" & strLinkText & "</A>"
end if
iCurrentLocation = iLinkEnd
Loop
strOutput = strOutput & Mid(strInput, iCurrentLocation)


Tekst_temp = strOutput


i = 1


WHILE NOT InStr(i,Tekst_temp,"[k]") = 0
start = CInt( InStr(1,Tekst_temp,"[k]") )
i = start
slutt = CInt( InStr(start,Tekst_temp,"[/k]") )
hole = mid(Tekst_temp,(start),(slutt-start+4))
'linkar uma palavra
IF InStr(hole,"$") THEN
skille = CInt( InStr(start,Tekst_temp,"$") )
'se quiser que uma determinada palavra fique linkada coloque
'palavra $ seguido do endereço http://
navn = mid(Tekst_temp,(start+3),(skille-start-3))
link = mid(Tekst_temp,(skille+1),(slutt-skille-1))

IF NOT InStr(link,"@") = 0 THEN 'se for email
link = "mailto:" & link
ELSE
IF Left(link,4) = "www." THEN ' caso tenha www
link = "http://" & link
ELSE 'se não tiver www
link = "http://" & link
END IF
END IF 'fim do @
'out_var = "<A HREF=""" & link & """>" & navn & "</A>"
out_var = "<A HREF=""" & link & """ target=""_blank"">" & navn & "</A>"
Tekst_temp = Replace(Tekst_temp,hole,out_var,1,1)
ELSE
'aqui start+???? significa a quantidade de caracter
link = mid(Tekst_temp,(start+3),(slutt-start-3))
IF Left(link,4) = "www." THEN
link = "http://" & link
END IF 'www
IF NOT InStr(link,"@") = 0 THEN
link = "mailto:" & link
END IF '@
'link = "<A HREF=""" & link & """>"
link = "<A HREF=""" & link & """ target=""_blank"">"
Tekst_temp = Replace(Tekst_temp,"[k]",link,1,1)
Tekst_temp = Replace(Tekst_temp,"[/k]","</A>",1,1)
END IF
WEND
Linker = Tekst_temp
End Function
------------------------------

Função original: carlosjr@imasters.com.br
Adaptação:
guardiao@guardiaodaweb.com.br



Esta matéria foi postada originalmente no ASP4Developers por Marcio Lima (Guardião) (site), que na época era "Programador ASP e VBA, apaixonado por Design, futurismo e ficção.
". Hoje, vai saber...

segunda-feira, 4 de fevereiro de 2002

0

Tipos de dados no SQL Server

Retirado da edição de Setembro/1999 da revista Visual Basic Programmer's Journal











































































Tipo de dadoDescrição
BinaryContém até 8.000 bytes de dados binários de tamanho fixa. Tamanho fixo significa que o campo irá sempre utilizar o espaço que você definiu.
BitCria um campo true/false (verdadeiro/falso). Este tipo de dado armazena apenas os valores de 0 e 1 e não pode conter valores nulos.
CharContém até 8.000 bytes de uma string de tamanho fixo. Use este campo para dados this que irão sempre ser do mesmo tamanho.
DatetimeArmazena a data e hora com precisão de milissegundos em 8 bytes.
DecimalContém dados numéricos com um inteiro à esquerda do ponto decimal e uma parte fracionária a direita. Este campo irá ter um número variável de bytes, baseado na escala e precisão que você especificar. Escala é o número máximo de dígitos à direita do ponto decimal e precisão é o número total de dígitos em ambos os lados do the ponto decimal.
FloatUm tipo de dados numérico aproximado para armazenamento de longos números em ponto-flutuante, com a precisão de até 15 dígitos em 8 bytes. O SQL Server feralmente arredonda esses números para cima.
ImageContém até 2.147.483.647 bytes (aproximadamente 2Gbytes) de dados binários e costuma ser utilizado para armazenar grandes quantidades de dados como imagens ou arquivos de som. Campos definidos com este tipo de dado não podem ser indexadas, pesquisadas, agrupadas ou ordenadas.
IntArmazena um dado numérico preciso para todo número armazenado em 4 bytes. Pode conter números de -2^1031 a 2^1031.
MoneyContém dados monetários definidos com precisão de 4 dígitos. Ele é representado como um inteiro de precisão dupla e consome 8 bytes de armazenamento. Valores podem estar entre -992.337.293.685.477,5808 e 922.337.203.685.447,5807.
NcharContém até 4.000 caracteres Unicode. Tipo de dado de largura fixa, sendo armazenado no dobro de bytes (caracteres Unicode precisam de 2 bytes por caracter).
NtextArmazena caracteres Unicode até 1.073.741.823 posições, armazenados no dobro dos bytes declarados (caracteres Unicode precisam de 2 bytes por caracter).
NumericVeja Decimal.
NvarcharContém até 4.000 caracteres Unicode. Tipo de dado de largura variável, sendo armazenado no dobro de bytes (caracteres Unicode precisam de 2 bytes por caracter).
RealSimilar ao tipo de dado float, usando apenas 4 bytes de armazenamento com precisão de até 7 dígitos.
SmalldatetimeCampo data menos preciso, que armazena data e hora em precisão de minutos, utilizando 4 bytes.
SmallintArmazena dados numéricos preciso até a quantidade de números armazenados em 2 bytes. Menor que o int, ele pode conter números de -32.768 até 32.767.
SmallmoneyContém dados monetários decimais precisos até o 4 dígito. Usa 4 bytes de armazenamento e pode conter valores de -214.748,3648 até 214.748,3647.
TextContém uma string de caracteres não-Unicode com tamanho de até 2.147.483.647 caracteres. Similiar ao campo memo encontrado em outros bancos de dados, este tipo de dado armazena grandes quantidades de texto em páginas de 2kb. Colunas definidas com este tipo de dado não podem ser indexadas, pesquisadas, agrupadas ou ordenadas.
TimestampUm valor binário automaticamente atualizado cada vez que uma tabela com uma coluna deste tipo é alterada. Ele usa 8 bytes de armazenamento e é único dentro do banco de dados. Uma tabela só pode possui uma coluna deste tipo.
TinyintO menor tipo de dado inteiro, ele consome apenas 1 byte de armazenamento e pode conter números de 0 a 255.
UniqueidentifierUm número hexadecimal de 16 bytes, também conhecido como GUID (globally unique identification number). Use a função do SQL Server NEWID() para gerar novos identificadores únicos para alimentar uma variável ou uma coluna deste tipo de dado.
VarbinarySimilar ao tipo binário, este pode conter até 8.000 bytes de dados binários de tamanho variável. Tamanho variável significa que o campo irá consumir apenas o espaço necessário para armazenar os dados contidos no mesmo.
VarcharContém até 8.000 bytes de tamanho variável para strings. Use este tipo para colunas que irão armazenar valores nulos de dados que variam em tamanho.


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...