quarta-feira, 29 de julho de 2009

Erro ao carregar dataset tipado

Faz alguns dias que um rapaz no forum da msdn reclamou de um problema ao tentar carregar um DataSet. O erro era:
Falha ao ativar restrições. Uma ou mais linhas contêm valores que violam as restrições non-null, unique ou foreign-key(Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints).

Pesquisando um pouco, encontrei uma resposta interessante e que não tem muito a ver com a descrição da exceção no erro.
Segue o post retirado do blog de Arley Marciel, que tem todo o mérito pela "descoberta" :)

"Algumas vezes passamos por problemas na hora de carregar DataSets tipados quando há alguma inconsistência entre os dados do resultset e as configurações do objeto, geralmente a seguinte exceção e lançada:

Falha ao ativar restrições. Uma ou mais linhas contêm valores que violam as restrições non-null, unique ou foreign-key(Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints).

Dessa vez passei por algo pouco comum, a exceção estava acontecendo por uma inconsistência no tamanho(length) de um campo do tipo string, por algum motivo ele não “trunca” o texto e não consegue atribuir o valor à coluna do DataSet. Então para quem estiver passando por essa dificuldade fica ai mais essa dica a ser verificada."


fonte: http://arleymarciel.com.br/post/Falha-ao-ativar-restricoes-Uma-ou-mais-linhas-contem-valores-que-violam-as-restricoes-non-null2c-unique-ou-foreign-key(Failed-to-enable-constraints-One-or-more-rows-contain-values-violating-non-null2c-unique2c-or-foreign-key-constraints).aspx

domingo, 5 de abril de 2009

Conectando no SQL Server 2005 express pela rede

Pessoal, rapidamente... segue abaixo um tutorial que encontrei no Linha de Código (http://www.linhadecodigo.com.br/Artigo.aspx?id=1260&pag=1) feito pelo Diego Nogare.
Todos os méritos desse tutorial devem ser direcionados a este cara, eu só estou ajudando a internet com recursos de ajuda! hehehe
segue abaixo, o tutorial da íntegra do cara.

abraços!

ps: Ajuda se criar um usuário no modo SQL Authentication e utiliza-lo para conectar pela rede. No windows xp, o SQL Server aceita o usuário convidado com as devidas permissões, para utilizar o banco, mas no Windows Vista não.




Como configurar Conexão Remota no SQL Server 2005


Publicado em: 02/03/2007

Muitos casos de problemas com conexão ao servidor de Banco de Dados ocorrem por uma limitação que o SQL Server 2005 possui por padrão. Esta configuração de segurança que vem padronizada no SQL pode ser alterada facilmente. Neste artigo, será apresentada uma maneira de como solucionar este problema rapidamente. Para simular o ambiente, duas máquinas serão utilizadas. Uma será o Servidor de Banco de Dados, e a outra será a máquina cliente. No diagrama abaixo, existe uma arquitetura de exemplo para ilustrar a solução.

O nome do Servidor de Banco de Dados é NGRSERVER e a máquina cliente se chama NOTEBOOK. A instância do SQL Server 2005 que está no servidor é chamada de SQL2005.

Vamos ao que interessa. Ao tentar acessar o Servidor de Banco de Dados com sua configuração padrão, uma mensagem de erro é apresentada. Esta mensagem diz que ocorreu um erro enquanto estabilizava uma conexão com o servidor, esta falha pode ser pelo fato da configuração padrão do SQL Server não permitir conexões remotas.

"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections."

A solução deste problema é resolvida em alguns passos:

1. Permitir conexões remotas à instância do SQL Server que será acessada de outro computador;
2. Habilitar o protocolo TCP/IP para conexão e tráfego de informações;
3. Iniciar o serviço do SQL Server Browser;
4. Configurar o Firewall para permitir que informações relacionadas ao SQL Server seja permitido de passar por ele.

Estes passos garantem a conexão remota do SQL Server. Abaixo cada passo é explicado detalhadamente.

Passo 1: Para permitir que computadores acessem instâncias do SQL Server em outra máquina, a primeira coisa a ser feita é uma configuração na instância que receberá as conexões remotas, no nosso caso, o SQL2005 no servidor NGRSERVER.

Para fazer isso, conecte-se localmente na instância do servidor, clique com o botão direito na instância conectada e aponte o mouse para Properties.

Depois de acessar a tela das propriedades da instância do SQL Server, escolha, no menu da esquerda, a opção Connection. A parte direita da tela será referente à Connection, procure a opção Allow remote connection to this server. Deixe esta opção marcada. Clique em OK.

A conclusão deste procedimento passa a garantir que a instância do SQL Server poderá receber conexões remotas, mas este não é o único passo a ser cumprido. Mais alguns passos devem ser seguidos para a conclusão da tarefa.

Passo 2: Para permitir que o protocolo TCP/IP trafegue informações do SQL e que conexões possam ser estabelecidas através deste protocolo, vamos liberá-lo no SQL Server, utilizando uma ferramenta disponível na instalação das ferramentas de administração. A ferramenta é o SQL Server 2005 Surface Area Configuration. Esta ferramenta por padrão, encontra-se na pasta Configuration Tools do SQL Server 2005. Nesta ferramenta, utilizaremos os recursos de Surface Area Configuration for Services and Connections.


Acesse Surface Area Configuration for Services and Connections, no menu da esquerda expanda o item da instância, neste caso, SQL2005. Depois expanda Database Engine e selecione Remote Connections. Na tela da direita, selecione a opção Local and remote connections e em seguida Using TCP/IP only. Clique em OK.

Esta configuração permite agora, que a instância selecionada receba conexões locais e remotas, as conexões remotas serão somente por TCP/IP. A opção Using both TCP/IP and named pipes também poderia ser sido utilizada, sem problemas.

Continuando com a configuração do TCP/IP, vamos utilizar agora outra ferramenta, SQL Server Configuration Manager. Nesta ferramenta utilizaremos o recurso SQL Server 2005 Network Configuration, que se encontra no menu da esquerda. Ao expandir este item, encontramos o Protocols for SQL2005. Ao clicar nele, algumas opções se abrirão do lado direito da tela. Nas opções disponibilizadas, devemos deixar o protocolo TCP/IP com status de Enabled. Para fazer isso, clique com o botão direito do mouse em TCP/IP e vá em Enabled. Após isso, ele aparecerá configurado.

Depois de configurar o status para Enabled, mais duas verificações devem ser feitas nas propriedades do protocolo TCP/IP. Para acessar estas configurações, clique com o botão direito do mouse em TCP/IP e em seguida em Propriedades. Uma tela com duas abas superiores se abrirá. A primeira aba Protocol, deve ficar com a propriedade Enabled configurada para Yes.

Na segunda aba, IP Addresses, devemos garantir que as propriedades Active e Enabled estejam configuradas para Yes.

Após garantirmos estas configurações, clicamos em OK para salvar nossas alterações.

As alterações que foram feitas nestas duas ferramentas são úteis para garantir que a instância do SQL Server selecionada possa receber conexões remotas e que o protocolo remoto de conexão é o TCP/IP.

Passo 3: Para iniciar o serviço do SQL Server Browser, utilizaremos novamente a ferramenta SQL Server Configuration Manger. Para acessar a área que controla os serviços do SQL Server, no menu da esquerda, será utilizado o item SQL Server 2005 Services. Na parte direita da tela, os serviços relacionados ao SQL Server são apresentados. O serviço SQL Server Browser encontra-se com seu State configurado para Stopped. Para iniciar o serviço, clique com o botão direito do mouse no serviço e em seguida clique em Start. Este processo levará alguns instantes, e o State antigo passará a ser Running.

Após a inicialização do serviço do SQL Server Browser, e as configurações de liberação para acesso remoto e de TCP/IP, o serviço da instância do SQL Server deve ser reiniciado para que as alterações tenham efeito. Para fazer isso, na mesma tela onde foi iniciado o serviço do SQL Server Browser, selecione o serviço do SQL Server (SQL2005), clique com o botão direito do mouse e aponte p ara Restart. Aguarde alguns instantes a parada e a inicialização do serviço. Lembre-se que SQL2005 é a instância do SQL Server do servidor que utilizamos como exemplo.

Passo 4: Para que as conexões remotas funcionem no SQL Server 2005, o Firewall da rede deve ter exceções para as instâncias do SQL Server 2005 e o serviço do SQL Server Browser. Para exemplificar, colocaremos as exceções no Firewall do próprio Windows. Caso você utilize outro Firewall, você deve ler sua documentação para realizar o procedimento de liberação dos programas utilizados.

O Firewall do Windows está presente nas instalações do Windows XP com Service Pack 2 ou superior. Para acessar o Firewall do Windows, vá em Iniciar > Painel de Controle > Firewall do Windows ou digite firewall.cpl em Iniciar > Executar e clique em OK. A liberação no Firewall deve ser feita para cada instância que terá suas conexões remotas permitidas. Realizar estas exceções em cada instância do SQL Server é necessária pelo fato de ser permitido instalar diversas instâncias do SQL Server em um mesmo servidor. Cada instalação do SQL Server é chamada de instância, e cada instância pode ter quantos Bancos de Dados forem necessários, podendo ser repetidos ou não em uma instância ou outra. Para colocar uma instância do SQL Server nas exceções do Firewall, devemos abrir a aba Exceções do Firewall do Windows, clicar em Adicionar Programa, procurar o arquivo SqlServr.exe que por padrão, encontra-se na pasta C:\Arquivos de Programas\Microsoft SQL Server\MSSQL.1\MSSQL\Binn.

A pasta MSSQL.1 é a pasta referente à instância 1 do SQL Server. Se for colocar uma exceção para uma segunda instância do SQL, o arquivo SqlServr.exe deve ser localizado na pasta MSSQL.2.

Para colocar uma exceção ao serviço do SQL Server Browser, devemos seguir os mesmos passos que percorremos para colocar exceção à instância do SQL Server, a única diferença será procurar o arquivo SqlBrowser.exe que por padrão está na pasta C:\Arquivos de Programas\Microsoft SQL Server\90\Shared.

Estes passos apresentados auxiliam a conexão remota com o Servidor de Banco de Dados através de máquinas clientes. Podemos ver que seguindo os passos corretamente, o acesso de aplicações e de ferramentas administrativas deixou de ser exclusivamente da máquina do Servidor de Banco de Dados, e passou a ter acessos liberados para outras máquinas da LAN (Local Area Network). Lembrando que, para acessar uma instância do Banco de Dados, você terá que colocar um usuário e senha válidos para realizar a conexão.


quarta-feira, 18 de março de 2009

Disco virtual - ADrive

Bom pessoal, faz alguns dias que me perguntei "como pode a google não ter um disco virtual ainda?". Ta certo que o gmail tem espaço o suficiente pra quem precisa de um quebra galho de backups, mas o "upload" é máximo de 50mb e isso é realmente poco.
Por isso comecei a dar uma vasculhada geral na internet e acredito ter encontrado um que me parece muito bom: ADrive.
O ADrive é um disco virtual dividido em 3 planos:

  • Basic - é básico mesmo e gratuito
  • Signature - assinante básico
  • Premium - assinante premium
O Básico possui 50gb de espaço, acesso via http de qualquer lugar, é possível fazer upload de até 2gb por arquivo, pode fazer upload de diretórios ou arquivos de qualquer extensão, download de arquivo também é fácil e ainda conta com o Zoho editor, que é uma ferramenta de edição de arquivos (texto, planilhas e algumas coisas assim) que deve ter algumas limitações, mas de graça ta valendo muito.
O Assinante básico, conta com tudo isso e mais alguns aplicativos como ADrive desktop (não sei o que é, mas me parece bom), suporte 24hr por dia 7 dias por semana, FTP etc etc
E o Enterprise é tudo isso só que com mais de 50gb. Tem planos de 100gb pra cima.

Pra quem quizer mais detalhes, veja os planos do ADrive.

Bom sem contar que é possível compartilhar seus arquivos. Você compartilha, gera um endereço e envia via e-mail ou passe para seu contato que ele pode acessar o arquivo e fazer download.

Por ser gratuito já ganhou pontos comigo! Parece ser um serviço realmente bom, porém, se um dia a google lançar um... eles irão certamente perder um usuário!

De qualquer forma, fica ai a dica!

ps: para quem procura uma ferramenta de backup automático online, eu recomendo a mozy que também é gratuito. O único problema é que são 2Gb e ele "backupeia" um diretório ou arquivo, sobreescrevendo diariamente. Na verdade, vou utilizar os dois de forma combinada. Um para backup automático diário e o outro para ter as versões separadas.

sexta-feira, 6 de fevereiro de 2009

SQL Server 2005 : Tela azul da morte

Recentemente tenho me deparado com a Tela Azul da Morte no SQL Server ao tentar abrir uma tabela, ou editar registros!
Depois de tantas pesquisas, format's c: e exclusão e alteração de arquivos .sys encontrei algo que parecia inútil! Parecia...

Em um dos blogs, encontrei a seguinte informação (traduzida)
"ao tentar abrir uma tabela no sql server o windows gerou a tela azul! Descobri que isso é gerado a partir de um conflito dos drivers Intelipoint com o sql server! Na dúvida, removi o aplicativo..."

Ou seja, se você tem um mouse microsoft, seu erro pode ser derivado disso também! Incrédulo, relutei um pouco mas removi o software! Dito e feito. O meu SQL Server não gera mais a famosa tela azul BSOD.

Caso você tenha o problema, e o mouse... talvez isto ajude! Se você tiver o problema e não tiver o mouse, procure aplicativos intelipoint em sua máquina. Isso pode afetar.

Boa sorte, e nos vemos em breve!

ps: entre outras buscas, uma das respostas seria deletar a pasta shell e todos os arquivos que existem dentro da pasta de instalação do "microsoft sql server\90", mas como meu sql server nem possui esta pasta, não executei os testes.

terça-feira, 27 de janeiro de 2009

Adicionando o "Abrir prompt aqui" no menu de contexto do Windows XP

Você nunca se deparou com isso? Gostaria de clicar com o botão direito em cima de uma pasta do Windows e clicar no botão "Abrir prompt de comando aqui" e 'prompto' (hehe) ?
É fácil, e graças ao tutorial que encontrei no forum do Baboo isso ficou mais fácil ainda! Segue o tutorial que está lá.

Ps: a partir desta linha, todo o texto abaixo foi copiado do site Baboo a partir do link acima citado!


Adicione o 'Abrir prompt...' ao menu de contexto do XP
24/06/2008 13:03

No Windows XP, para utilizar a opção"Abrir Prompt de Comando Aqui" ao clicar com o botão direito do mouse em uma pasta é necessário instalar um dos PowerToys disponíveis. Mas caso você não queira instalar, é possível fazer uma pequena modificação no Registro para adicionar esta opção.

Veja como:

- No menu Iniciar, clique em Executar, digite regedit e pressione Enter.

- Com o Editor do Registro aberto, navegue até a chave HKEY_CLASSES_ROOT\Directory\shell.

- Clique com o botão direito do mouse na chave shell, selecione Novo e escolha Chave:

- Nomeie a chave como CommandPrompt, clique duas vezes em Padrão e mude o valor para Abrir Prompt de Comando Aqui:

- Em seguida, clique com o botão direito do mouse na chave CommandPrompt, selecione Novo e clique em Chave:

- Nomeie esta chave como Command, e dentro dela clique duas vezes em Padrão e mude o valor para cmd.exe /k cd %1:

Confirme a alteração e feche o Editor do Registro. O efeito da dica é imediato, basta clicar com o botão direito do mouse em uma pasta qualquer e você verá a opção:

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!