Páginas

Mostrando postagens com marcador MySql. Mostrar todas as postagens
Mostrando postagens com marcador MySql. Mostrar todas as postagens

quinta-feira, 24 de maio de 2012

Pequeno Tutorial de LINQ

Inicialmente quero agradecer ao Hussein e ao Hugo da Lista .Net-Br...Valeu mesmo pelos elogios...isso me motiva a colocar cada vez mais postagens. Eu por muitos anos so usava o SQL, meu berço de aprendizagem de programação foi no meio de Selects interminaveis, com inner joins e wheres De repente veio o Linq, na internet nao tem nada que explique muito bem ele, nao de forma que eu consiga entender, no maximo encontrei um programa que converte SQL em Linq com 90% ou 95% de acerto, o que ja ajuda demais, o nome desse programa é Linqer porem o mesmo é pago, não existem formas de crackear, o que seria ate mesmo injusto tamanha a eficiencia dele perto do preço.
O Linq traz uma forma de tratar o banco de dadosque me agradou muito, que foi a portabilidade, quantas vezes eu tive que sair caçando SQLs que pararam de funcionar porque saiu do Access pro MySql ou do MySql pro SqlServer e ate mesmo pro Oracle?
Com o Linq acabou isso tudo, e a forma que ele trata as queries torna a coisa mais facil para se programar, o Visual Studio integra todo mundo perfeitamente, e com pouca coisa ja se sai programando normalmente conseguindo uma produção normal em qualquer cenario de trabalho.

Inicialmente devemos instanciar o banco de dados na classe que sera criado a querie Linq, Vou dar como exemplo a forma que eu instancio, lembrando que nesse exemplo eu estou usando o Linq to Entities

[Atualização = Observação muito bem vinda do Bernardo do grupo .Net-Br usar o using ao invez de declarar direto como eu fiz, faz que o dispose seja automatico]
using BancoEntities BD = new BancoEntities();

Caso nao saiba fazer uma conexao de exemplo, aqui mesmo no blog eu ja postei sobre como fazer uma conexão com o MySql

Num banco de dados de exemplo poderiamos colocar as tabelas:
TbFuncionarios
FuncId - Int - Pk
FuncNom - VarChar - 50 Caracteres
FuncEnd - VarChar - 100 Caracteres

TbHorarios
HorId - Int - Pk
FuncId - Int - Fk
HorManha - Hora
HorTarde - Hora
HorDat - Data

Não vou me ater muito a modelagem porque esse não é o proposito do post, e para o aprendizado essas duas tabelas ja estao bem, veja que temos um relacionamento de um para muitos (um funcionario muitos horarios)

Vamos Iniciar com um select simples na tabela de funcionarios
Sql => Select FuncId, FuncNom, FuncEnd from tbFuncionarios
Linq => from Listagem in BD.tbFuncionarios select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

Sql => Select * from tbFuncionarios
Linq => from Listagem in BD.tbFuncionarios select Listagem

lembrando que usar o * em SQLs prejudica a performance porque o comando tem que ir na tabela central do banco de dados achar quem sao todos os campos da tabela em questao para so depois dar select nelas, ja no Linq isso nao ocorre porque ele ja tem a referencia pelo Entities.

ja um select com where:
Sql=> Select FuncId, FuncNom, FuncEnd from tbFuncionarios where FuncNom = 'XXX'
Linq=> from Listagem in BD.tbFuncionarios where Listagem.FuncNom == 'XXX' select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

Por estarmos lidando com uma linguagem tipada é bom não esquecer de que as comparações do where sao obrigatoriamente do mesmo tipo ou seja string == string, int==int, e assim por diante, frisando bem CHAR NAO É IGUAL VARCHAR, INT NAO É IGUAL A DOUBLE
Mas nao estamos a beira do precipicio nesse sentido, porque vc pode usar os casts ou seja o .ToString() e assim por diante, o importante é que na comparação final os tipos estejam devidamente igualados, senão nao funciona

e que tal com o order by?
SQL=> Select FuncId, FuncNom, FuncEnd from tbFuncionarios order by FuncNom
Linq=>from Listagem in BD.tbFuncionarios order by Listagem.FuncNom select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

agora algo que revirei por horas por algo entendivel na net e nao achei, e muita mas muita gente mesmo tem essa duvida que é o famoso inner join
SQL=> Select FuncId, FuncNom, FuncEnd, tbHorarios.HorManha from tbFuncionarios inner join tbHorarios on tbHorarios.FuncId = Funcionarios.FuncId  order by FuncNom
Linq=> from Listagem in BD.tbFuncionarios
 join ListaHoras in BD.tbHorario on Listagem.FuncId equals ListaHoras.FuncId
 select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd, ListaHoras.HorManha}

Lembrando mais uma vez que deve se igualar os tipos.
Espero ter ajudado
Ate mais!

sexta-feira, 18 de maio de 2012

Conectando o MySql no Visual Studio 2010

Quando eu nao sabia direito como funcionava, eu procurei muito na internet e nao achei nada que fosse realmente esclarecedor para mim, tentei por muito tempo diversas formas diferentes, mas nada dava certo satisfatoriamente.
Primeiro vamos as considerações:
Nao adianta querer trabalhar com o MySql no Visual Studio 2010 express, ele simplesmente nao tem suporte.
(Mas como assim? eu conheço fulano, ciclano e beltrano que conseguiu) Explicando, ele nao tem um suporte facil, porem se voce ja dominar a linguagem você consegue sim (todo o segredo esta no web.config), porem com muitas limitações(code first pode esquecer).
O melhor suporte que eu encontrei foi no Visual Studio 2010 ultimate que é o que eu vou descrever aqui.
Me parece, não sei se estou certo, a Microsoft não tem interesse em tornar o MySql nativo do Visual Studio, nao sei se no 2011 ja mudou, mas acredito que não.
Entao temos que baixar o conector do MySql, nao vou colocar o link direto aqui, esse foi um erro que encontrei em diversos sites que eu consultei inicialmente para tentar entender e sempre ficava a duvida se as instruções eram para uma versão especifica ou era mais generico, basta entrar no site do MySql, e baixar a ultima versão do conector que sempre sera necessario, por diversos motivos, entre eles, correção de bugs, mais rendimento e etc...
Uma vez baixado e instalado, reinicie o Visual Studio e mãos a obra.
Modele o banco de dados externamente já que o code first não esta disponivel (se alguem conseguiu comente que eu estudo o modo e coloco um post so sobre isso aqui), e no projeto criado clique com o botao direito na pasta models(para uma melhor organização) selecione "Add" e na aba seguinte "New Item" ira aparecer uma janela mais ou menos como a da imagem abaixo, basta selecionar em "Installed Templates" a opção "Data" para filtrar as opções de dados e logo após "ADO.NET Entity Data Model", como na imagem abaixo:
Primeiro passo
O nome que eu dei é somente um exemplo, pode ser desconsiderado (ja vi programador que ate hoje se utiliza de nomes propostas por cursos, então eu tento nao prender ninguem no meu sistema de nomenclatura).
Quando clicar em ok uma janela como a de baixo ira aparecer:
Segundo Passo
Escolha o "Generate from database", pois o outro gera um sql que não é inteiramente compativel com o MySql, pelo menos ate a versão que eu testei, entao recomendo usar ele
Clicando em "Next" a proxima tela ira aparecer:
Eu numerei os passos, no circundado numero 1 voce podera escolher entre outras conexoes ja prontas entre todos os bancos de dados que ja foram selecionado, aqui iremos escolher "New Connection"
Ira aparecer uma tela como a seguir:


Aqui finalmente iremos "Desenterrar" o nosso MySql Connector, em "Data Source" provavelmente ira figurar outra conexão a outro tipo de banco de dados, clique em Change e selecione "MySql DataBase (Mysql Data Provider)" (se essa opção não estiver disponivel nesse passo, é porque seu conector nao esta instalado corretamente, ou algum outro problema ocorreu escreva sua duvida nos posts que eu tento resolver junto.) Em "Server Name", coloque o endereço de acesso ao banco de dados (ip, site e afins), em "User Name" o nome de usuário e em "Password" sua senha de acesso ao seu banco de dados, opcionalmente marque "Save my password" eu uso marcado, e nesse post vou considerar que você marcou tbm.
Feito tudo isso o proprio conector ira entrar no banco de dados selecionado e você podera escolher o banco de dados que ira usar.
Se tudo deu certo ate agora provavelmente voltara a tela anterior novamente.
Selecione "Yes, include include the sensitive data in connections string", isso fara com que nao seja necessario reescrever a connexction a cada conexao ao banco sendo que a mesma ficara inclusa no web.config.
"Tique"  a caixa logo acima do numero 2 para ele ficar habilitado e nomeie a sua conexão ao banco de dados.
Se tudo deu certo ate agora o entity ira entrar no seu banco de dados e mapea-lo, fornecendo uma tela como a seguir:
onde todas as tabelas ja estarao mapeadas e prontas para serem usadas.
Em model Namespace nomeie o seu model e pronto!
Seu projeto ja estara conectado no banco de dados MySql.
Agradeço a atenção de todos.
Esse post foi pedido pelo Arthur Ciurilli por pedido de Marcos Bazzo.
Espero ter ajudado e se alguem quizer alguma postagem em especial é so pedir no meu email que esta aqui no site mesmo que eu faço o post com muita satisfação.