D3POD Posted September 30, 2014 Report Share Posted September 30, 2014 Boas, estou a tentar fazer um read de um valor numa tabela da minha base de dados. Já tentei várias formas e até alguns exemplos que guardei (em tempos devo ter feito algo funcional com uma situação idêntica), mas não estou a conseguir. Estou a usar SQL Server. Segue o meu código que está no evento Load do form... a ideia é inserir este valor numa label. string label = lb_nreparacao.Text; string query = "SELECT numero FROM reparacoes WHERE numero = @numero"; SqlConnection con = new SqlConnection(server); SqlCommand cmd = new SqlCommand(query, con); con.Open(); cmd.Parameters.AddWithValue("@numero", label); cmd.ExecuteReader(); Acho que me está a faltar qualquer... Cumprimentos Link to comment Share on other sites More sharing options...
Rechousa Posted September 30, 2014 Report Share Posted September 30, 2014 Viva, Assumindo que pretendes retornar uma string, deves substituir a última linha por esta: string retorno = cmd.ExecuteScalar().ToString(); Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa Link to comment Share on other sites More sharing options...
D3POD Posted October 1, 2014 Author Report Share Posted October 1, 2014 O valor é um int na base de dados e eu quero passar esse valor para uma label. Penso que o meu problema esteja nesta linha: cmd.Parameters.AddWithValue("@numero", label); mais propriamente na "label"... neste campo devo colocar o destino do valor ou não? Link to comment Share on other sites More sharing options...
nelsonr Posted October 1, 2014 Report Share Posted October 1, 2014 Experimentaste o que o Rechousa disse? Quando pretendes ler o primeiro resultado do primeiro registo, podes usar o ExecuteScalar (retorna o primeiro valor do primeiro registo ou null) em vez de usares o ExecuteReader e teres de criar um reader só para isso Link to comment Share on other sites More sharing options...
D3POD Posted October 1, 2014 Author Report Share Posted October 1, 2014 Sim experimentei, mas não estou a conseguir. Eu acho que faltou me dizer um pormenor... A ideia é eu ler o ultimo valor da coluna "numero". Isto serve para quando o utilizador abre o form aparecer logo o numero da reparação que vão inserir... ou seja o ultimo numero da database + 1 Link to comment Share on other sites More sharing options...
nelsonr Posted October 1, 2014 Report Share Posted October 1, 2014 (edited) Então não precisas do parametro, basta alterares o select para retornar o ultimo numero. Algo assim (não testado) int proximoNumero = 1; using(SqlConnection con = new SqlConnection(server)) { SqlCommand cmd = new SqlCommand("SELECT TOP 1 numero FROM reparacoes ORDER BY numero DESC", con); con.Open(); int? ultimoNumero = (int?)cmd.ExecuteScalar(); if(ultimoNumero.HasValue) proximoNumero = ((int)ultimoNumero)+1 } Edited October 1, 2014 by nelsonr Link to comment Share on other sites More sharing options...
D3POD Posted October 1, 2014 Author Report Share Posted October 1, 2014 Duas duvidas: 1º Como posso passar agora o valor para a label? 2º Se a variável ultimonumero já foi criada como do tipo int porque é que na ultima linha volto a referir o int? Obrigado por toda a ajuda 🙂 Cumprimentos Link to comment Share on other sites More sharing options...
nelsonr Posted October 1, 2014 Report Share Posted October 1, 2014 1º lb_nreparacao.Text = proximoNumero.ToString(); 2º O ExecuteScalar retorna uma variavel do tipo object (porque o SELECT pode estar a retornar uma data, um numero, texto, etc), então precisas de fazer o cast para atribuir a variavel de outro tipo Link to comment Share on other sites More sharing options...
D3POD Posted October 1, 2014 Author Report Share Posted October 1, 2014 Tenho o código assim: int proximonumero = 1; string query = "SELECT TOP 1 numero FROM reparacoes ORDER BY numero DESC"; SqlConnection con = new SqlConnection(server); SqlCommand cmd = new SqlCommand(query, con); con.Open(); int? ultimonumero = (int?)cmd.ExecuteScalar(); if (ultimonumero.HasValue) proximonumero = ((int)ultimonumero) + 1; lb_nreparacao.Text = proximonumero.ToString(); Isto dá me o retorno do numero 1... mas eu acho que ele está a pegar-me no valor que eu atribuiu a quando da criação da variável e coloca na label. Eu não entendi foi a utilização do "using" que meteste no teu exemplo, podes explicar? Link to comment Share on other sites More sharing options...
nelsonr Posted October 1, 2014 Report Share Posted October 1, 2014 O using deve ser usado quando se cria ligações, para que quando a execução do código saia fora do bloco do using, automaticamente é chamado o dispose da variavel, fechando a ligação à base de dados. Isso acontece mesmo que seja gerada uma excepção que force a saida anormal da execução. Para confirmares se está a funcionar corretamente, coloca um breakpoint na linha seguinte ao ExecuteScalar e verifica se está a ler o valor corretamente Link to comment Share on other sites More sharing options...
D3POD Posted October 1, 2014 Author Report Share Posted October 1, 2014 Não sei trabalhar com o breakpoint, pelo que vou adiantar já a parte do gravar na base de dados e assim verifico se passa para o próximo numero. Para já ele apresenta-me o numero 1... mas como a variável é iniciada com 1, ele pode estar apenas a passar esse valor Link to comment Share on other sites More sharing options...
D3POD Posted October 2, 2014 Author Report Share Posted October 2, 2014 Bom dia, ora já avancei com o passo seguinte e está tudo a funcionar... quando tento avançar com uma nova reparação ele apresenta corretamente o próximo numero. Agora vou estudar os breakpoints e vou estudar o código bem que há coisas que ainda não percebo muito bem. Obrigado a todos pela ajuda 🙂 Cumprimentos, D3POD Link to comment Share on other sites More sharing options...
nelsonr Posted October 2, 2014 Report Share Posted October 2, 2014 Os breakpoints são um ferramenta muito importante para fazeres debug à tua aplicação. Permitem indicares uma (ou várias) linhas que queres que a aplicação faça uma pausa. Quando a execução do código passa nessa linha, a aplicação faz uma pausa permitindo analisares como a aplicação está no momento (por exmeplo, ver o conteúdo das variaveis). Além disso, permite depois ires avançando linha a linha na execução (Tecla F10 para passar para a proxima linha ou F11 para passar para a proxima execução). Ai consegues ver se a aplicação está a passar por onde pretendes Link to comment Share on other sites More sharing options...
D3POD Posted October 2, 2014 Author Report Share Posted October 2, 2014 Por acaso isso já costumo fazer mais ou menos, pensava que fazia mais que isso e que essa parte era apenas o "muito básico" dos breakpoints 🙂 Só não sabia ver o valor das variáveis, mas já percebi como funciona 😉 Obrigado mais uma vez por toda a ajuda. Cumprimentos Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now