Jump to content

[Resolvido] querys


tonelol1
 Share

Recommended Posts

Boas estou aqui com problema em com bd em que n sei o porque do erro se me poderem dizer o porque agradecia trololol ;P

o código e este:

Dim query As New OleDbCommand("SELECT Lugares.Lugares_abensa, lugares.Lugares_ocupados FROM Lugares", con)
 con.Close()
 con.Open()

 Dim dr As OleDbDataReader = query.ExecuteReader
 '-----
 If dr.HasRows Then
	 dr.Read()
	 y = dr("Lugares_abensa")
	 x = dr("Lugares_ocupados")
 End If
 '------

o erro que me da é :OleDbException was unhandled(Não foi fornecido nenhum valor para um ou mais parâmetros necessários.)

btw a bd tem mais um campo id mas mesmo que eu faça select do campo e escreva esse campo ele continua a dar esse erro

agradecia toda ajuda fornecida

Cumps 👍

Edited by ribeiro55
Link to comment
Share on other sites

Boa tarde,

Antes de mais executa a tua query directamente na base de dados, assim vês se esta retorna-te resultado, poderás ter algum campo mal escrito. Está-me a parecer que a tua variável con está mal definida, se puderes mostra-me como estás a declarar e a inicializar.

Em relação a teres a ligação aberta a base de dados não há problema, contudo não podes ter a o teu reader aberto, podes usar um if para resolver o teu problema. Por fim aquele dr.Read() não me parece bem à primeira vista, deverá ser um

While dr.read() 

Experimenta assim:

Dim query As New OleDbCommand
Dim dr As New OleDbDataReader

if con.state =  ConnectionState.close then
  con.open()
end if
query.connection=con
if query.connection.state = ConnectionState.close then
  query.connection.open
end if

query.commandtext = "SELECT Lugares.Lugares_abensa, lugares.Lugares_ocupados FROM Lugares"
dr = query.excecutereader
if dr.hasrows then
  while dr.read()
  y = dr("Lugares_abensa")
     x = dr("Lugares_ocupados")
  end while
dr.close
con.close
end if

Mais uma vez verifica se a tua con está bem declarada.

Espero ter ajudado

Link to comment
Share on other sites

Boas

a minha variável con e esta

Public con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\GparqueBD.mdb")

btw tentei a tua maneira mas sempre que ele vai ler a query

dr = query.ExecuteReader

dame o mesmo erro :/ [Não foi fornecido nenhum valor para um ou mais parâmetros necessários]

obrigado a mesma

se descobrires o erro agradecia resposta 🙂

Link to comment
Share on other sites

Boa noite Tonelol1,

Estive a testar o código e já sei qual é o problema, embora tenha algumas dúvidas no porquê do erro, mas como já é más horas de estar acordado e daqui a pouco tenho de acordar para o trabalho ei de deixar para amanha uma pesquisa a fundo sobre o assunto.

O teu problema não reside no código propriamente dito mas sim na query SQL e na própria Base de Dados.

Um concelho que te dou desde de já é não usares maiusculas e minusculas, opta somente por minusculas, porque um dos teus problemas reside aqui. e isso é algo que irei confirmar amanhã, outra coisa que irei confirmar é o uso de "_".

Isso é algo que me está a fazer confusão pois estou a usar bases de dados em (*.sde) e MSSQL e não tive este problema, mas contudo e apesar de o VB.net não ser Case Sensitive já tive problemas do género com Object Names.

Assim sendo deixo-te este código completo e testado de uma ligação a uma base de dados mdb. Não te esqueças de confirmar se a base de dados está dentro da pasta do projecto. Aconselho-te também a criar um novo projecto e testar o código primeiro, de modo a veres e perceberes o funcionamento e então só depois colocares no teu projecto real.

Abaixo segue o código testado em que a query para facilitar usei um

 Select * from Lugares 

e no Dr.Read invés de usar a String, usei o indice. Como referi acima, podes continuar a fazer o da forma que tava por campos ou um * ta tudo e fazeres o dr.read através do nome do campo na base de dados ou pelo indice, e digo isso porque em projectos meus estou a fazê-lo com a diferença que utilizo bases de dados em MSSQL, a questão é mesmo na criação da extrutura da base de dados no que respeita maiusculas e minusculas e caracteres especiais.

Imports System.Data.OleDb
Public Class Form1
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\GparqueBD.mdb")
Dim query As New OleDbCommand
Dim dr As OleDbDataReader
Dim x, y As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	Try
		If cn.State = ConnectionState.Closed Then
			cn.Open()
		End If
		query.Connection = cn
		If query.Connection.State = ConnectionState.Closed Then
			query.Connection.Open()
		End If
		query.CommandText = "SELECT * FROM Lugares"
		dr = query.ExecuteReader
		If dr.HasRows Then
			While dr.Read
				x = dr(0)
				y = dr(1)
			End While
		End If
		dr.Close()
		cn.Close()
	Catch ex As Exception
		MsgBox(ex.Message)

	End Try
End Sub
End Class

Só uma ultima observação, se esta tabela tiver por exemplo 100 registos, só irá guardar o ultimo, pois está sempre a reescrever ambas as variáveis "x" e "y". Segui como base o código original, mas não sei se a intenção seria mesmo esta, caso contrário deverá guardar os valores ou para um array multi dimensional ou uma lista ou algo do género.

Espero ter ajudado, vou agora dormir um pouco e espero amanha um feedback tanto positivo ou negativo. 🙂

Edited by djbarbas
Link to comment
Share on other sites

Boas o teu código funcionou 5 estrelas muito obrigado

ja agora

Só uma ultima observação, se esta tabela tiver por exemplo 100 registos, só irá guardar o ultimo, pois está sempre a reescrever ambas as variáveis "x" e "y". Segui como base o código original, mas não sei se a intenção seria mesmo esta, caso contrário deverá guardar os valores ou para um array multi dimensional ou uma lista ou algo do género.

O meu objectivo e fazer um simulador de entrada e saída de um parque mesmo que desligue o programa eles ficão la guardados a parte do select deu prefeito com o teu código mas agora tenho um problema ele não me faz o update xD

sempre que eu carrego no botão o objectivo e adicionar +1 a variável x que são os lugares ocupados na bd e para quando for la carregar outra ves ele vai me buscar a variável x a bd e por +1 o quevai corresponder a 2 (exemplo) pode ser 5 ,6,... dependendo do valor da bd ja registado. isso era o que eu queria que o botão fisese mas quando eu vou a carregar pela 2 vez ele vai me buscar o mesmo valor da primeira pq a variável x nao esta ser inserida na bd :S

desculpa se nao me expliquei bem ;P

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Try
	 If cn.State = ConnectionState.Closed Then
		 cn.Open()
	 End If
	 query.Connection = cn
	 If query.Connection.State = ConnectionState.Closed Then
		 query.Connection.Open()
	 End If
	 query.CommandText = "SELECT * FROM Lugares"
	 dr = query.ExecuteReader
	 If dr.HasRows Then
		 While dr.Read
			 y = dr(1)
			 x = dr(2)
		 End While
	 End If
	 dr.Close()
	 cn.Close()
 Catch ex As Exception
	 MsgBox(ex.Message)
 End Try
 If b = "50" Then
	 MsgBox("Parque cheio Porfavor tente mais tarde")
 Else
	 x = x + "1"
	 Dim query2 As String = "UPDATE Lugares SET Lugares.lugares_ocupados=@ocupados"
	 con.Close()
	 con.Open()
	 Dim command As New OleDbCommand(query2, con)
	 ' Indicação dos parâmetros que serão actualizados

	 command.Parameters.Add("@ocupados", OleDbType.VarChar).Value = x
	 End If
End Sub

este e o código ele executa na "corretamente" quere dizer não da nenhum erro mas tbm não esta a fazer o update isso e que n sei pq.

eu meti break points para ver se ele estava a fazer o select direito indo buscar a variável x e y, o que esta a funcionar.

O update e que deve estar mal e nao sei o pq ja que isto nem sequer me da um erro para eu me guiar XD

Se me pudesses ajudar outaves agradecia :/

Ja agora muito obrigado pelo primeiro código 🙂

btw se quizeres posso-te mandar o programa juntamente com a bd se isso for mais facil para tua veres o que eu estou a tentar fazer

desculpa la se estou a ser muito chato :S

Edited by tonelol1
Link to comment
Share on other sites

Boas, é

Sempre que possível programa dentro da Tag "Try" assim sempre que haja um erro que não estejas a contar o programa não irá crashar e irá devolver-te o erro em questão como mencionei-te no exemplo acima. Então se percebi bem, queres fazer uma leitura a base de dados daqueles 2 campos e guarda-los nas variáveis x e y. tou a perceber aquele b, não deveria ser x ou y? Não necessitas de criar outra variável query2, já tens a variável query criada e inializada, somente voltas a definir o commandtext. A tua contatenação também não está bem, fica então assim definida a query:

query.commandtext = "UPDATE Lugares SET lugares_ocupados= " & variável + 1 

Esta variável +1 é a variável que leste na base de dados mais 1.

Muito por alto implementa o código abaixo naquele que já te mandei antes entre

dr.close()
'
' IMPLEMENTA AQUI!
'
If x = "50" Then
       MsgBox("Parque cheio Por favor tente mais tarde")
Else
       query.CommandText = "UPDATE Lugares set lugares_ocupados=" & x + 1
       msgbox ("Actualizei " & query.ExecuteNonQuery & " registo(s)")
end if
cn.close()

Isso deverá ser sufeciente, mas atenção que não testei, testa e diz-me alguma coisa, o restante código apaga.

Assumi que a tua variável x é a variável que vai buscar a base de dados o total de lugares ocupados. Tenta perceber o código que te mandei, se tiveres alguma dúvida diz-me

Edited by djbarbas
Link to comment
Share on other sites

queres fazer uma leitura a base de dados daqueles 2 campos e guarda-los nas variáveis x e y. tou a perceber aquele b, não deveria ser x ou y?

tipo o x e lugares ocupados por pessoas "normais" e o y e numero de pessoas registadas e o maximo do parque 50 logo pensei que b = numero de lugares ocupados + lugares registados ate um maximo de 50 .

nao sei se me fiz entender :S

Com isto mal tenha oportunidade vou testar o teu codigo e depois digo algo.

Mais uma vez obrigado pela ajuda

Link to comment
Share on other sites

muito obrigado pelo codigo, está a funcionar.

uma coisa a parte, imagina que tenho :

For i = 1 To contador
           informacao = informacao + "      " + info(i)
       Next

e em vez de ter espaços é possivel dar o "enter"?

Edited by tonelol1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.