quarta-feira, 3 de dezembro de 2008

Parte 3: Concatenando Strings!

Mais um pequeno teste para avaliarmos as melhoras.
A concatenação de strings pode ser feita de diversas maneiras. O problema é: Qual é a melhor maneira?

Existem mil maneiras de preparar Néston, invente uma!

Fizemos um teste com 6 maneiras diferentes de concatenar uma string. São essas:

1 - Executando um Append por texto Ex:
dim MyStr as new StringBuilder
MyStr.Append("Texto1")
MyStr.Append("Texto2")

2 - Utilizando o Append.Format
dim MyStr as new StringBuilder
MyStr.AppendFormat("{0}{1}","Texto1","Texto2"

3 - Dando um apend e concatenando os textos com &
dim MyStr as New StringBuilder
MyStr.Append("Texto1" & "Texto2")

4 - Concatenando diretamente utilizando o operador +
dim MyStr as String = "Texto1" + "Texto2"

5 - Concatenando diretamente utilizando o operador &
dim MyStr as String = "Texto1" & "Texto2"

6 - E por fim, utilizando diretemante o String.Format para concatenar
Dim MyStr as string = String.Format("{0}{1}", "Texto1", "Texto2")


A operação funciona da seguinte forma:

TempoInicial = Now() ' Definimos o tempo inicial For I as Integer = 0 To 10000 ' Rodamos 10000 vezes o mesmo processo pra medir o tempo MyStr = MyStr CONCATENANDO "Texto1" "Texto2" 'utilizamos aqui, cada vez um processo diferente dos 6 citados acima Next

Ou seja, na segunda iteração, vamos ter "Texto1Texto2" Concatenando com "Texto1" e "Texto2"
Na terceira iteração teremos "Texto1Texto2Texto1Texto2" Concatenando com "Texto1" e "Texto2" e assim consecutivamente.
Isso pra aumentar cada vez mais o tamanho da string que recebe o resultado do concatenamento.

Rodamos o mesmo teste 10 vezes de cada maneira, para pegarmos uma média de tempo que demorava a executar.

Resultado: O resultado era próximo do que eu esperava. o processo 4, 5 e 6 estão fora de cogitação! Eles sempre apresentaram mais de 1 segundo para rodar as 10 mil iterações da concatenação!
O que me assustou, foi o resultado positivo!
Eu realmente acreditava que o Append.Format (nr. 2) era a melhor, porém fui surpreendido!
Ela foi a pior das melhores! Ganhou apenas das outras três que já descartamos.
A maneira 3 apresentou alguns dos resultados idênticos aos da maneira 1! Porém na média final, perdeu!
A maneira 1, utilizando um append por linha, mesmo sendo a que menos me atraia, é a que tem melhor performance!
Os resultados numéricos podem ser vistos na imagem!

O fonte está disponível no meu SkyDrive. Clique aqui para fazer download!

terça-feira, 2 de dezembro de 2008

Parte 2: CType, Convert.To, Directcast e TryCast

No teste de performance e melhores práticas de hoje vamos mostrar a conversão de variáveis de tipo nativo (inteiro, decimal, data, double, etc...) e variáveis de referência (objetos, classes,etc...)

CType x Convert:

A Classe Convert é uma classe utiliátria do .Net Framework, que internamente executa o Ctype ou Directcast após realizar algumas verificações.

Para executar o teste, criamos uma aplicação que possui um Datagridview que mostra o tempo que demorou para executar 1 milhão de vezes o mesmo processo.
Convertemos, em todos os casos, o valor Nothing para o tipo.

Na figura 1 abaixo mostramos um resultado da conversão. A figura esta separada por:

  • Coluna: mostra o tipo para qual o NOTHING foi convertido
  • Linha: Mostra a função utilizada para converter: Convert.ToType ou Ctype


figura 1

Resultado: Podemos notar, que em quase todos os casos o CType é 2x mais rápido que o Convert.To"Type".
O tempo em segundos é mínimo, portanto se você utiliza poucas conversões de cada vez não chega a fazer diferença. Rodamos 1 milhão de vezes cada alteração para conseguir este tempo. Se for ver cada iteração, é instantâneo. Só é possível medir a diferença em grandes escalas mesmo.

Opinião pessoal: Hoje eu já utilizo o Ctype nas conversões e estou mais acostumado. Acredito ficar mais fácil identificar até porquê o próprio Visual Studio marca os CType's com azul, enquanto o Convert.To"Type" fica na mesma cor (na configuração padrão de cores e estilos). Desse jeito, considero melhor visualmente falando e em questões de performance também.


Directcast x TryCast:

O Directcast converte objetos/classes assim como o TryCast. A diferença entre eles, é que se o Directcast não conseguir converter para a classe específicada, ele retorna uma exception, enquanto o TryCast retorna nothing.
No exemplo, criamos um formulário que herda da classe FORM. Disparamos 3000 vezes o DirectCast(MeuFormulario,Form) e o TryCast(MeuFormulario,Form)
O Cast sempre é executado com sucesso (nossa classe MeuFormulario herda da classe FORM), e por isso nenhum exceção foi disparada e o cast nunca retornou nothing.

Resultado: O tempo de cast é exatamente o mesmo. Fizemos 3 testes e os 3 retornaram igual. Isso porquê o teste sempre foi executado com sucesso. Caso o cast fosse impossível ou desse erro, o Directcast dispararia uma Exception e o TryCast retornaria nothing. Em que ponto chegamos disso? Que depende da aplicação do cast. Se você precisa essêncialmente que o seu Cast seja valido, você pode utilizar o directcast dentro de um bloco Try... Catch e tratar a exceção, ou então utilizar o TryCast e verificar se o resultado foi nothing, se for validar da forma certa.

Opinião Pessoal: Como os tempos foram exatamente iguais, é indiferente você utilizar um ou outro, a não ser que sua aplicação necessite de um determinado tratamento. Dificilmente eu preciso que execute um Exception, por isso prefiro tratar com TryCast's, mas isso não passa de opinião pessoal. Façam bom proveito pessoal.

PS; Agradecimentos: Gostaria de agradecer a galera que da um apoio ao blog, principalmente ao Caio Proiete do blog http://www.caioproiete.com/blogs/pontonet
Ele me ensinou bastante coisa sobre performance e melhorias de código, e dessa maneira eu repasso a quem interessa. Da mesma maneira, quem quizer deixar sua ajuda, fique a vontade! Utilize os comentários para nos ajudar

Obrigado a todos!

segunda-feira, 1 de dezembro de 2008

.Net: Testes de Performance e Melhores Práticas - Parte 1

Iniciando nosso bloco "Testes de Performance e Melhores Práticas" vamos apresentar a utilização do DataGridView e do SqlDataReader em alguns pontos.
Pra quem já conhece bem os procedimentos, fique ligado nos tópicos e vá direto ao assunto sem perder seu tempo. Quem ainda esta começando, montamos um cenário, caso queira reproduzir.

1º Teste do dia:
Vamos executar alguns testes de inserção de linhas em um DataGrid e verificar sua perforamance.

No exemplo utilizaremos:
Um DataGridView que iremos chamar de Grid.
O Grid possui 3 Colunas dentro dele. Seus nomes são: Coluna01, Coluna02 e Coluna03.
Estão colunas possuem indíces, que representam sua atual posição no Grid. São respectivamente 0,1 e 2.
O IndiceDaLinha representa o número da linha atual, que estamos inserindo no grid.

Primeiro, vamos fazer o Grid inserir 20.000 (vinte mil) linhas nas suas 3 colunas utilizando indíce numérico para definir a coluna que receberá o valor. Desta forma, o comando fica +- assim:
Grid.Rows(IndiceDaLinha).Cells(0).Value = "ValorNaColuna1"
Notem que o índice em negrito está representando a coluna de nome Coluna01, e estou definindo para esta linha e coluna do Grid, o valor texto "ValorNaColuna1", apenas para teste. Vamos inserir um valor parecido para as demais colunas.
Grid.Rows(IndiceDaLinha).Cells(1).Value = "ValorNaColuna2"
Grid.Rows(IndiceDaLinha).Cells(2).Value = "ValorNaColuna3"

No segundo teste, utilizamos o mesmo Grid, a mesma quantidade de linhas e colunas com seus respectivos nomes, mas desta vez ao invés de utilizarmos o índice da coluna (0,1,2) vamos utilizar o nome da coluna. O comando fica +- assim:
Grid.Rows(IndiceDaLinha).Cells("Coluna01").Value = "ValorNaColuna1"
Notem que agora passamos o nome da coluna entre "" para
Grid.Rows(IndiceDaLinha).Cells("Coluna02").Value = "ValorNaColuna2"
Grid.Rows(IndiceDaLinha).Cells("Coluna03").Value = "ValorNaColuna3"

Resultado: A resposta de tudo isso, foi uma melhor performance em 0,97 segundos para inserir todas as 20.000 (vinte mil) linhas, se usarmos por índices numéricos (exemplo 01). Algo parecido com 0,0000485 segundos por linha.

Opinião pessoal: para uma aplicação comun, do dia a dia, utilizar um código elegante ajuda os desenvolvedores e não piora tanto a situação. Quem convive diariamente com relatórios de 20.000 linhas? Este 1 segundo é tão importante para gerar o relatório? Por isso, eu fico com a utilização do índice pelo nome da coluna. Mas isso é só opinião minha, nada demais! ;D

Foi sem querer, mas valeu: Até deixar os dois ambientes iguais, eu verifiquei um terceiro teste de performance!
Ao solicitar a ultima linha do datagrid, eu selecionei assim "me.Grid.Rows.GetLastRow(Displayed)"
No outro grid, sem querer eu coloquei assim "me.Grid.Rows.GetLastRow(None)"
A diferença? Com NONE, eu consegui mais de 5 SEGUNDOS mais rapido do que Displayed! O motivo exato eu ainda não sei, mas os dois métodos trouxeram as linhas de forma correta e consegui manipular também. Ou seja, 5 segundos mais rapido e nenhum problema "aparente" (não fui a fundo para descobrir, não era esse o mérito) Mais tarde faço outros testes e dou uma pesquisada, dai sim posto para vocês o motivo disso.

2º Teste do dia:
No segundo teste, vamos executar uma consulta de banco de dados em um SqlDataReader. Após isso, vamos verificar quais pontos podem fazer efeito na melhoria de performance da aplicação.

Assim como DataGridView, podemos buscar dados de um DataReader pelo índice da coluna no DataReader ou pelo nome da Coluna.
O índice da coluna no reader, é equivalente a posição desta coluna no banco no comando Select.
O nome da coluna no reader, é o mesmo nome da coluna usado no banco de dados ou o apelido da coluna, caso ela tenha algum.

No exemplo utilizaremos:
Um SqlDataReader que chamaremos de MeuReader
Para gerarmos um Reader, precisamos de um SqlCommand que guarda o comando texto e dispara o método executereader. O retorno deste método do SqlCommand, é o conteudo do MeuReader.
Ex:
Dim sqlConn as new SqlConnection(SuaStringdeConexãocomoBanco)
Dim sqlComando as new SqlCommand("Select Coluna1 as Col1, Coluna2 as Col2, Coluna3 as Col3 From Colunas", sqlConn)
Dim MeuReader as SqlDataReader = sqlComando.ExecuteReader()
Pronto, populamos o nosso DataReader com o resultado de uma consulta Sql.
Esta consulta Sql é um teste e vai me retornar 10000 registros.
Note que eu utilizei apelidos nas colunas, desta maneira não vou me referir a Coluna1 pelo nome, e sim por "Col1" etc...

No primeiro teste, vamos utilizar os índices das colunas. Como citei antes, o índice é a posição da coluna no comando Sql.

While MeuReader.Read()
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item(0).ToString
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item(1).ToString
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item(2).ToString
End While
o .ToString após o item do Reader é porquê o resultado seria um objeto, e no meu caso, este objeto é String. Este objeto pode ser de qualquer valor (string, integer,etc...) cabe a você definir.

No segundo teste, vamos utilizar o nome das colunas no banco. Vamos utilizar o mesmo comando, o mesmo procedimento, só mudando na hora de pegar o valor do banco, alteramos o índice numérico para nome da coluna.

While MeuReader.Read()
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item("col1").ToString
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item("col2").ToString
Grid.Rows(IndiceLinha).Cells(IndiceColuna).Value = MeuReader.Item("col3").ToString
End While
Note que utilizei o alias (apelido) da coluna e não o nome dela. Se na criação do comando Select eu não tivesse nenhum apelido pras colunas, eu usaria no lugar do col1, coluna1 por exemplo.

Resultado: A resposta de tudo isso, foi 0,11 segundos mais rápido se utilizarmos o exemplo novamente, o índice das colunas por número.

Opinião pessoal: Mais uma vez, a pergunta é: Até onde vale a performance? Lógico que buscamos excelência sempre, porém 10.000 linhas, não é toda aplicação que necessita de 10.000 linhas sempre que vai sentir-se prejudicada por 0,11 segundos. Veja bem, não estamos falando nem de 1 segundo! é 1 décimo de segundo. Muito pouco! Para os desenvolvedores, é muito mais visível durante o código se utilizarmos o nome da coluna. Dessa forma sabemos sem precisar procurar o comando disparado, o valor que a coluna deve retornar e o tipo do valor. Fácil e prático.

Melhor ainda: Para dar um "boost" na performance, existe no SqlCommand um ExecuteReader() que usa por parâmetro um System.Data.CommandBehavior. Para deixar realmente mais rápido, podemos utilizar o parâmetro CommandBehavior.SequentialAccess desta forma SqlCommand.ExecuteReader(CommandBehavior.SequentialAccess).
Ele torna o acesso as colunas, sequêncial e único. Ou seja, você é obrigado a usar as colunas na ordem que foi criado o select. No exemplo, você só pode usar as colunas na ordem Coluna1, Coluna2 e Coluna3, e somente uma vez por coluna. Caso você precisasse utilizar a Coluna2 antes da Coluna1, ou precisasse utilizar mais de uma vez a mesma coluna, um exception ia ser disparado. Este comando torna mais rápido porém é restrito. De qualquer forma, caso você precise alterar as ordens ou utilizar mais de uma vez, basta jogar em variáveis na ordem, e depois utilizar estas variáveis. Dai fica tudo rápido e certo! Com isso, tivemos um ganho de mais de 0,6 segundos. O que em 10 consultas gera 6 segundos e assim por diante.

Bom, é isso pessoal. O post saiu maior do que eu esperava mas acredito que deu pra ajudar um pouco. Em breve, iremos executar mais testes e postar aqui. Caso tenha vontade de conhecer alguma coisa mais a fundo comente. Vamos verificar, pode ter certeza.

abraços e até a próxima

Próximos Posts: Testes de performance e praticidade

Em breve, estarei executando alguns testes de performance e praticidade de código que podem ajudar a gente no dia a dia. Tipo um "best pratices", principalmente para VB.NET.

Dessa forma, vamos ver algumas coisas como:
DataReader: utilizar reader.item(index) é melhor ou pior que utilizar reader.item(columnname)?
Tipos de dados: Ctype, Directcast, TryCast, ou Convert.To"Type"

entre outras coisas.

Quem quizer ter um teste executado, post aqui em comentário que faremos
até a proxima

domingo, 30 de novembro de 2008

Da seção Saco de vacilo: Parte 1

Inaugurando a seção "Saco de vacilos", onde iremos mostrar alguns errinhos dos aplicativos que usamos no dia a dia, o felizardo escolhido foi o SQL Server Express em Português. Lógico que não podemos reclamar, ferramente free e muito útil, mas erro é erro!

Estou procurando o grupo de dados que me causou este erro ainda, hehe! Um dia eu pego esse "bando" de dados sem vergonha!




SQL Server Express - Configurações para acesso remoto em rede

A alguns dias me deparei com um pequeno problema. Minha aplicação precisava rodar em 3 máquinas, no escritório do cliente.

Como já tinha ouvido falar muito bem do SQL Server Express por ser gratuito e tudo mais, decidi usa-lo, mas ao tentar rodar ele em rede tive alguns problemas. Isso tudo, pq por default o SQL não permite conexões externas.

Sendo assim, procurei e encontrei um tutorial bom. Segue abaixo o passo a passo de como instalar e configurar um SQL SERVER EXPRESS, feito por Nilton Pinheiro do site MCDBA Brasil

"Instalação Side-by-Side com o SQL Server 2000

Se você pretende instalar o SQL Express em um computador que já tenha o SQL Server 2000 ou MSDE instalado, garanta que o SQL Server 2000 ou MSDE esteja atualizado com o SP3 ou superior. Versões anteriores ao SP3 não compartilham apropriadamente a porta UDP 1434 e pode fazer com que sua instância do SQL Express não esteja disponível para as aplicações clientes.

Embora você possa alterar a ordem de inicialização dos serviços para que o serviço SQL Browse inicie antes do SQL Server 2000 ou MSDE, o recomendado é que você atualize todas as versões do SQL Server 2000 ou MSDE para o SP3 ou superior. Para fazer download do Service Pack mais recente, veja Microsoft SQL Server Web site.

O Serviço SQL Browser

O serviço SQL Browser (sqlbrowser) permite que aplicações clientes se conectem a uma instância do SQL Server 2005 ou SQL Server 2005 Express Edition sem conhecer a porta TCP/IP atribuída para a instância.

Nota: Por razões de securança, o SQL Express não inicia automaticamente o serviço SQL Browser durante a instalação.

Como o Serviço SQL Browser trabalha

Quando uma instância do SQL Express é iniciada, ela é atribuída a um número de porta TCP/IP. Esta porta será usada pela instância para se comunicar ou trocar dados com as aplicações clientes. Devido este número de porta ser geralmente desconhecido para as aplicações, o serviço SQL Browser atua como um tradutor, traduzindo o nome de instância passado pela aplicação, para o número de porta TCP/IP apropriada. Para fazer isso, o serviço SQL Browser fica escutando por requisições de rede nas portas TCP/IP 1433 e 1434.

Por default, o serviço SQL Browser está desativado. Se você esta acessando um cópia local do SQL Express, você não necessitará iniciar este serviço. Entretanto, se você precisa que sua aplicação acesse o SQL Express através da rede, você deverá primeiro habilitar um dos protocolos de rede e então iniciar o serviço SQL Browse. Posteriormente veremos como configurar o SQL Express para trabalhar em uma rede.

Requisitos Necessários

Antes de iniciar a instalação do SQL Server Express é importante observar que para instalar e funcionar adequadamente alguns requisitos são necessários como:

Processador: Pentium III ou compatível 500Mhz, recomendado 1Ghz
Sistema Operacional: Windows Server 2003 SP1, Windows Server 2003 Enterprise Edition SP1, Windows Server 2003 Datacenter Edition SP1, Windows Small Business Server 2003 Standard Edition SP1, Windows Small Business Server 2003 Premium Edition SP1, Windows XP Professional SP2, Windows XP Home Edition SP2, Windows XP Tablet Edition SP2, Windows XP Media Edition SP2, Windows 2000 Professional Edition SP4, Windows 2000 Server Edition SP4, Windows 2000 Advanced Edition SP4, Windows 2000 Datacenter Server Edition SP4
Memória RAM: Mínimo de 192MB, recomendado 512MB ou superior
Espaço em disco: 600MB livres

Microsoft .NET Framework 2.0 (2.0.50727.42)
Windows Installer 3.1
Microsoft Internet Explorer 6.0 SP1 ou superior

Nota: O Microsoft .NET Framework 2.0 e o Windows Installer 3.1 não são instalados juntos com o SQL Express. Sendo assim, certifique-se de estar com o .NET Framework 2.0 e Windows Installer 3.1 instalados antes de iniciar a instalação do SQL Express.

Desinstalando um Relase Anterior do SQL Express e Visual Studio 2005

Caso você pretenda instalar a versão final do SQL Express na mesma máquina onde já tenha instalado um release Beta ou CTP do SQL Server Express ou Visual Studio 2005, você deverá remover os releases anteriores do SQL Express, Visual Studio 2005 e .NET Framework 2.0 antes da instalação. Como estes produtos dependem da mesma versão do .NET Framework, eles devem ser desinstalados na seguinte ordem:

  • SQL Server 2005 Express
  • Visual Studio 2005
  • .NET Framework 2.0
  • IMPORTANTE: Qualquer dúvida sobre o processo de desintalação, veja uninstall any previous versions.

    Instalando o SQL Server Express

    1) Para iniciar o processo de instalação do SQL Express, efetue duplo-clique sobre o arquivo SQLEXPR.EXE

    Nota: Se preferir, é possível extrair os arquivos de instalação para um diretório temporário utilizando a sintaxe SQLEXPR.EXE /X via linha de comando.

    2) Na janela End User License Agreement, leia a licença de uso e selecione o check box I accept the licensing terms and conditions. Clique em Next para prosseguir.

    3) O SQL Server Component Update é executado e instala os requisitos necessários para a instalação do SQL Express como o Microsoft SQL Native Client e Microsoft SQL Server 2005 Setup Support Files.

    4) Na janela Welcome to the Microsoft SQL Server Installation Wizard clique em Next para prosseguir.

    5) No próximo passo o SQL Express apresenta a janela System Configuration Check (SCC). Da mesma forma como no SQL Server 2005, o SQL Express faz uma verificação em busca de possíveis problemas (requisitos mínimos de hardware e software) que possam impedir a instalação do SQL Express. Caso algum problema seja encontrado você terá a opção de visualizar o relatório sobre o problema encontrado e possível solução.

    6) Na janela Registration Information entre com as informações solicitadas e clique em Next.

    Algumas observações importantes devem ser feitas aqui:
    a) Devido ao SQL Express ser um produto gratuito, não existe solicitação para o Product Key.
    b) Se você selecionar a opção Hide advanced configuration options, a janela Service Account - a qual permite definir qual conta de usuário será usada para iniciar os servidor do SQL Express e a janela Collation Settings - o qual permite informar qual Collation e Code Page o SQL Express deverá utilizar, não serão apresentadas. Neste caso o SQL Server Express será instalado com sua configuração padrão.

    7) Na janela Feature selection, selecione os componentes que deseja instalar e clique em Next para prosseguir.


    8) A janela Instance Name (não será apresentada se você selecionar a opção Hide advanced configuration options) permite que você selecione uma Default instance ou Named instance para sua instalação. Uma instância pode ser Default Instance (não nomeada) ou Named Instance (nomeada). Quando o SQL Server 2005 é instalado como Default Instance ele não requer que o cliente especifique o nome da instância para fazer a conexão. O cliente necessita conhecer apenas o nome do servidor SQL ao qual deseja se conectar.

    Uma Named Instance é identificada pelo nome do servidor mais o nome da instância que você especificou durante a instalação. O cliente necessita conhecer o nome do servidor e o nome da instância para se conectar.

    Por default, o SQL Server é instalado como Default Instance (não nomeada) a menos que você especifique um nome de instância durante a instalação. Ao contrário do SQL Server, o SQL Server Express é por default instalado como Named Instance, tendo como nome padrão para a instância o nome “SQLExpress”. Se você não informar um nome para a instância durante a instalação ou não desmarcar a opção Hide Advanced configuration options, o nome padrão será usado. Neste caso, você deverá acessar o SQL Express como computername/SQLExpress (a barra utilizada aqui deve ser a mesma utilizada na separação de diretórios).

    Você também pode instalar o SQL Express como Default Instance (não nomeada) - permitindo que apenas o nome do servidor seja informado durante a conexão se nenhuma outra versão do SQL Server já estiver instalada no servidor como default instance. Para fazer isto, instale o SQL Express como named instance usando como nome para a instância o nome MSSQLSERVER.

    Nota: Para que o SQL Express permita informar um nome diferente para a instância, desmarque a opção Hide Advanced configuration options na janela Registration Information no início da instalação.

    9) A janela Service Account (não será apresentada se você selecionar a opção Hide advanced configuration options) permite que se atribua a conta local system (local system account) ou uma conta de usuário de domínio (domain user account) para iniciar os serviços SQL Server Express.

    Por default o SQL Server Express é instalado tendo a conta de sistema Network Service como conta para a inicialização dos serviços. Entretando, a recomendação é que se use uma conta de domínio ou então crie-se uma conta local específica para a inicialização dos serviços.

    10) Na janela Authentication Mode especifique o modo de segurança que deverá ser utilizado para se conectar ao SQL Express e clique em Next.

    11) Na janela Collations Settings selecione o Collation designator e o sort order desejado e clique em Next para continuar.

    Nota: Por padrão o SQL Express é instalado como case-insensitive, accent-sensitive. Ou seja, não faz restrição a maiúsculas e minúsculas, mas faz restrição a acentuação. Com isso, durante uma pesquisa, "João" e "joão" são a mesma coisa mas "João" e "Joao" ou "joão" e "joao" NÃO são. Para evitar futuros problemas com acentuação ou caracteres maiúsculos e minúsculos, recomendo que você selecione o Collate conforme tela acima. A não ser é claro, que você precise manter a compatibilidde de collate com outos servidores. Neste caso, selecione seu collate conforme o collate das versões anteriores.

    12) Na janela Error Reporting, selecione se você deseja reportar erros para o SQL Express e seus componentes à Microsoft. Esta opção é habilitada por padrão.

    13) Na janela Ready to Install , clique em Install para iniciar o processo de instalação do SQL Express.

    Assim como no SQL Server 2005 a janela Setup Progress permite acompanhar o processo de instalação de cada componente.

    Instalando o SQL Server Express via linha de comando

    Para aqueles que estão acostumados a instalar o MSDE 2000 via linha de comando, verão que instalar o SQL Server Express via linha de comando é tão simples quanto instalar o MSDE. Inclusive, a sintaxe e os parâmetros de instalação são bem semelhantes.

    Antes de iniciar o processo de instalação do SQL Express via linha de comando, é preciso extrair os arquivos de instalação para um caminho temporário. Para extrair os arquivos de instalação, execute o pacote do SQL Express com a opção /X e informe o caminho onde os aquivos deverão ser extraídos.

    Exemplo: C:/SQLEXPR.EXE /X

    Depois de extraído os arquivos, a instalação do SQL Express via linha de comando pode ser realizada de duas formas bastante simples:

    1. Chamando o setup.exe e especificando os parâmetros desejados na própria linha de comando.

    Exemplo:
    start /wait setup.exe /qb ADDLOCAL=ALL INSTANCENAME=SQLEXPRESS SECURITYMODE=SQL SAPWD=pass SQLCOLLATION="SQL_Latin1_General_CP1_CI_AI" SQLAUTOSTART=1 DISABLENETWORKPROTOCOLS=0

    2. Criando um arquivo de configuração e especificando o mesmo na linha de comando

    Caso você não queira executar o setup especificando os parâmetros, uma alternativa é executá-lo informando um arquivo .ini, o qual deverá conter todos os parâmetros a serem utilizados durante a instalação.

    O arquivo .ini é um arquivo texto que pode ser criado usando o NotePad e deve ser salvo com a extensão .ini. A primeira linha do arquivo deve ser [Options], depois se devem especificar os parâmetros sendo um em cada linha. Depois de criado o arquivo .ini, execute o setup usando a opção /settings para informar o arquivo .ini

    O exemplo abaixo utiliza o arquivo setup.ini para executar o setup.exe e informar os parâmetros desejados.

    Exemplo:
    start /wait setup.exe /qb SAPWD=pass /settings setup.ini

    -- conteúdo do arquivo setup.ini
    [Options]
    ADDLOCAL=ALL
    INSTANCENAME=SQLEXPRESS
    SECURITYMODE=SQL
    SQLCOLLATION="SQL_Latin1_General_CP1_CI_AI"
    SQLAUTOSTART=1
    DISABLENETWORKPROTOCOLS=0

    Nos exemplos acima, o parâmetro ADDLOCAL=ALL informa ao setup do SQL Express que devem ser instalados todos os seus componentes. INSTANCENAME indica o nome da instância, SECURITYMODE indica que o modo de autenticação a ser utilizado é o SQL Authentication, SQLCOLLATION informa o collation default a ser utilizado pelo SQL Express, SQLAUTOSTART informa ao setup para configurar o serviço do SQL Express para inicialização automática, SAPWD informa a senha para o usuário sa e o parâmetro DISABLENETWORKPROTOCOLS indica quais os protocolos deverão estar habilitados.

    É importante ficar atento ao valor informado no parâmetro DISABLENETWORKPROTOCOLS, o qual por default é 1. O valor 1 informa ao SQL Express para desativar os protocolos TCP/IP e Named Pipes. Como conseqüência o SQL Express não aceitará conexões vindas de outras máquinas da rede. Os possíveis valores para o parâmetro podem ser.

    DISABLENETWORKPROTOCOLS = 0; Shared Memory= On, Named Pipe= On, TCP= On
    DISABLENETWORKPROTOCOLS = 1; Shared Memory= On, Named Pipe= Off (Local Only),TCP= Off
    DISABLENETWORKPROTOCOLS = 2; Shared Memory= On, Named Pipe= Off (Local Only), TCP= On

    Ao utilizar um dos dois métodos de instalação apresentados acima, as contas de serviço SQL Server Express e SQL Server Browser serão iniciadas com o usuário de sistema NT AUTHORITYNetworkService. Para especificar uma conta de serviço diferente, acrescente os parâmetros abaixo:

    SQLACCOUNT=
    SQLPASSWORD=
    SQLBROWSERACCOUNT=
    SQLBROWSERPASSWORD=

    Para obter uma lista completa de todos os parâmetros que podem ser utilizados na instalação via linha de comando e seus respectivos significados, após extrair os arquivos do SQL Express para um caminho temporário, leia o arquivo template.ini.

    Configurando o SQL Express para a Rede

    Se você esta desenvolvendo ou possui uma aplicação que irá se conectar a uma instância do SQL Express através da rede, existe várias considerações que você deve estar ciente:

    1) Por razões de segurança, os protocolos de rede são desabilitados por padrão. Você pode habilitar os protocolos individualmente durante a instalação (quando instalando o SQL Express via linha de comando) ou após a instalação.
    2) O SQL Express é instalado como named instance por padrão.
    3) O serviço SQL Browser é usado por alguns protocolos de rede para associar instâncias nomeadas com números de portas TCP/IP. Entretanto, se o SQL Express é instalado no mesmo computador que uma versão anterior ao SP3 do MSDE ou SQL Server 2000, pode ocorrer alguns conflitos.

    Quando você instala o SQL Express, os protocolos de rede são desabilitados por padrão. Isto faz com que após a instalação o SQL Express não aceite conexões vindas de outras estações de uma rede. Apenas a conexão local (na própria máquina onde o SQL Express foi instalado) é permitida. Para permitir que o SQL Express se comunique com suas aplicações através de uma rede, você deve primeiro habilitar um dos protocolos de rede e então iniciar o serviço SQL Browser.

    O SQL Express suporta os seguintes protocolos de rede:

    Protocolo de rede

    Descrição

    Padrão

    Shared Memory

    Permite conectar a uma instância do SQL Express rodando no mesmo computador. Não pode ser usado para acesso de outras estações da rede.

    Habilitado

    TCP/IP

    Permite que outras estações se conectem ao SQL Express por especificar o nome do servidor e o nome da instância (default SQLExpress) ou o endereço IP e o nome da instância.

    Desabilitado

    Named Pipes

    Permite que outras estações se conectem ao SQL Express por suportar vários protocolos de rede, incluindo NetBEUI, TCP/IP e IPX/SPX. Ele seleciona o protocolo de rede automaticamente baseado na configuração do cliente.

    Desabilitado

    Habilitando os protocolos de Rede

    Demonstrarei aqui como habilitar e configurar o protocolo TCP/IP no SQL Express usando o utilitário SQL Server Configuration Manager.

    Nota: Você deverá reiniciar o serviço do SQL Express após fazer alterações para os protocolos de rede. Também é recomendado a reinicialização do serviço SQL Browser.

    Para habilitar o protocolo TCP/IP siga os passos abaixo:

    1) No menu Iniciar (Start), selecione Programas, Microsoft SQL Server 2005 e então clique sobre SQL Server Configuration Manager.
    2) Expanda SQL Server 2005 Network Configuration e clique sobre Protocols for InstanceName. No painel da direita, clique com o botão direito sobre o protocolo TCP/IP e selecione Enable.

    Para configurar o protocolo TCP/IP:

    1) No SQL Server Configutation Manager, clique com o botão direito sobre TCP/IP e selecione Properties (Propriedades).
    2) Na guia IP Addresses, para IPAll coloque 1433 em TCP Port.
    3) Clique em OK para fechar a janela e salvar as alterações.

    Nota: O procedimento acima configurou a porta 1433 para todos os IP configurados em sua máquina. Caso você deseje configurar uma porta apenas para um IP específico, localize o IP desejado (IP1, IP2...) e siga o mesmo procedimento.

    Iniciando o serviço SQL Browser

    Para iniciar o serviço SQL Browser, estando no SQL Server Configuration Manager:

    1) Selecione SQL Server 2005 Services
    2) No painel da direita, clique com o botão direito sobre o serviço SQL Server Browser e selecione Start (Iniciar).
    3) Para fazer com que o serviço seja iniciado automaticamente, clique com o botão direito e selecione Properties (Propriedades)
    4) Na guia Services (Serviços), em Start Mode selecione Automatic (Automático)
    5) Clique em OK para fechar a janela e salvar as alterações.
    Testando a Conectividade com o SQL Server Express

    Uma das maneiras mais simples de testar a conectividade com o servidor SQL Express é utilizando o utilitário de linha que comando sqlcmd.exe. Este utilitário é instalado junto com o SQL Express e para testar a conectividade, abra uma janela DOS e execute o comando sqlcmd -E -S.

    Caso você tenha selecione Mixed Mode como método de autenticação ao SQL Express, então também pode utilizar o comando sqlcmd -Usa -Psenha_do_sa -S.

    Se o prompt de comando ficar como 1>, é sinal de que a conexão foi estabelecida com sucesso.

    Além do utilitário sqlcmd.exe, também é possível testar a conectividade remota com o SQL Express utilizando o utilitário PortQry. O PortQry é um utilitário de linha de comando (também existe uma opção gráfica) que você pode utilizar na solução de problemas de conectividade com o protocolo TCP/IP. Ao ser executado ele mostrará o status da porta TCP ou UDP, seja para um computador local ou remoto. O PortQry pode ser executado sobre o Windows Server 2003/XP e 2000.

    Quando executado sobre a porta UDP 1434, o PortQry consulta todas as instâncias do SQL Server que estão rodando no computador.

    Para testar a conectividade utilizando o PortQry, supondo que o utilitário estreja na raiz do disco C:

    1) Abra uma janela DOS e digite C:/portqry -n NomedoServidor_ou_IP -e 1434 -p udp

    Um retorno semelhante ao abaixo garante que a porta está funcionando corretamente:

    Querying target system called:
    winxptmp

    Attempting to resolve name to IP address...
    Name resolved to 128.1.81.62
    querying...
    UDP port 1434 (ms-sql-m service): LISTENING or FILTERED
    Sending SQL Server query to UDP port 1434...
    Server's response:
    ServerName WINXPTMP
    InstanceName SQLEXPRESS
    IsClustered No
    Version 9.00.852
    tcp 1433

    ==== End of SQL Server query response ====
    UDP port 1434 is LISTENING

    2) Para testar a conectividade com a porta TPC/IP 1433 digite C:/portqry -n NomedoServidor_ou_IP -e 1433 -p tcp

    Um retorno semelhante ao abaixo garante que a porta está funcionando corretamente:

    Querying target system called:
    winxptmp

    Attempting to resolve name to IP address...
    Name resolved to 128.1.81.62
    querying...
    TCP port 1433 (ms-sql-s service): LISTENING

    Bom pessoal, espero que com este artigo vocês possam ter uma visão básica do novo SQL Server 2005 Express Edition, que está chegando para substituir o velho e bom MSDE. Seguindo este artigo passo-a-passo vocês conseguirão instalar e testar o SQL Express sem nenhuma dificuldade."



    Post original: http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=67

    Blogger Begins

    Bom pessoal, após trocar umas idéias com alguns amigos decidi criar este blog. Vai ser um espaço para postar alguns confrontos mentais que tenho e também problemas do dia a dia no mundo da programação e desenvolvimento de sistemas.

    Nos veremos por ai...