PDA

View Full Version : VB Problemi rognosi query parametriche e bindingnavigator.. help ç_ç


KeySim
12-10-2009, 12:57
Ragazzi sono veramente in crisi.. son giorni che cerco di trovare soluzione a due problemi:

1° Problema) Orario

Spiego meglio:programmo in vb e dovrei caricare su un database sqlserver dei dati in una tabella cronologia, e fin quà tutto bene, però nel caricare la data ( es. 21/12/2009 12.24.13) intesa come data e ora scrivo questa funzione:

cmdDB.CommandText = "INSERT INTO [CronologiaEventi] (Data) VALUES ('" & Date.Today() & "')" 'ho messo date.today perchè mi accetta solo quello

con il seguente risultato, che nella colonna riguardante l'ora mi scrive 12/10/2009 0.00.00 .. in pratica non salva l'ora. Ora ho provato a fare come molti forum consigliano: query parametriche, ecco il codice :

cmdDB.CommandText = "INSERT INTO [CronologiaEventi] (Data) VALUES ('" & "@data" &"')"



cmdDB.Parameters.Add("@data", SqlDbType.DateTime).Value = date.now()



E mi da questo errore: " Conversione non riuscita durante la conversione di una stringa di caratteri nel tipo di dati datetime."

Ragazzi ho provato di tutto aiutatemi..



2° Problema) BindingNavigator

http://img115.imageshack.us/img115/6331/tab.jpg


Spiego meglio: Ho due tabelle come potete vedere nell'immagine di sopra con una relazione uno a molti tra di loro. Ora io vorrei visualizzare tramite un bindingNavigator i dati della seconda tabella però non tutti solo quelli con una determinata condizione ovvero con ad esempio il valore 3 della seconda colonna quindi in quel caso avrei 3 record da visualizzare in delle textbox e spostarmi da un record all altro tramite il binding.. ora vi posto il codice che ho scritto io che ho preso da un forum e che ho elaborato per me:



Dim connectString As String = "Data Source=KEY\SQLEXPRESS;Initial Catalog=PinnaMag;Integrated Security=True" Qua imposta la connessione al database


Dim connection As New SqlConnection()
connection.ConnectionString = connectString
connection.Open()

' Eseguo la query
Dim command As New SqlCommand("Select Id_Magazzino From MagaAttuale WHERE Cod_Prodotto =1", connection)

Dim reade As SqlDataReader = command.ExecuteReader()

' Carico i dati nel database..


Me.ds.Load(reade, LoadOption.OverwriteChanges, New String() {"MagaAttuale"})



BindingNavigator1.BindingSource = bs E infine assegno il bindingsource al binding navigator..

Il risultato è una ciofeca, nel senso che il programma si avvia ma nel binding navigator mi dà solo un valore da scorrere e le caselle con cui dovrei visualizzare il tutto non vanno.. dove ho sbagliato? se potete aiutatemi.. se no abbandono il bindingnavigator e faccio tutto a mano -.- .

Grazie saluti

MarcoGG
12-10-2009, 13:22
...
1° Problema) Orario
...
cmdDB.CommandText = "INSERT INTO [CronologiaEventi] (Data) VALUES ('" & "@data" &"')"


Strano modo di concatenare, può dipendere sicuramente da quello. Dal momento che hai definito un Named Parameter, lo puoi passare direttamente alla stringa Sql :

cmdDB.CommandText = "INSERT INTO nomeTabella ( Data ) VALUES ( @data )"

KeySim
12-10-2009, 13:32
Se faccio come hai detto te mi da errore e mi dice "Dichiarare la variabile scalare "@data"."

MarcoGG
13-10-2009, 11:53
Se faccio come hai detto te mi da errore e mi dice "Dichiarare la variabile scalare "@data"."

Bah, devi aver combinato qualche pasticcio...
Comunque io i Named Parameters li gestisco così, e non ho mai avuto problemi. Un esempio :

Dim strCN As String = "Data Source=nomeMacchina\SQLEXPRESS;Initial Catalog=nomeDB;Integrated Security=SSPI;"
Dim CN As New SqlClient.SqlConnection(strCN)
Dim strSql As String = "INSERT INTO nomeTabella (id, nome, data) VALUES ( @id, @nome, @data )"
Dim CMD As New SqlClient.SqlCommand(strSql, CN)
CMD.Parameters.Add("@id", SqlDbType.Int).Value = <valore>
CMD.Parameters.Add("@nome", SqlDbType.VarChar).Value = <"valore">
CMD.Parameters.Add("@data", SqlDbType.DateTime).Value = <valore>
CN.Open()
CMD.ExecuteNonQuery()

Liscio come l'olio, non so perchè a te non funzioni... :mbe:

KeySim
13-10-2009, 12:48
ecco il mio codice conseguente al tuo..


cmdDB.CommandText = "INSERT INTO [CronologiaEventi] (Id_Maga,Azione,Data,Operatore) VALUES ('" & idmaga & "','" & "Aggiunta" & "',@data,'" & idPersona & "')"

cmdDB.Parameters.Add("@data", SqlDbType.DateTime).Value = "10/03/2009 12.11.10"

Dim cmdDBC As New SqlClient.SqlCommand(cmdDB.CommandText, connDB)
cmdDBC.ExecuteNonQuery()

PROBLEMA: dichiarare variabile scalare @data.. fai te

MarcoGG
13-10-2009, 12:59
ecco il mio codice conseguente al tuo..


cmdDB.CommandText = "INSERT INTO [CronologiaEventi] (Id_Maga,Azione,Data,Operatore) VALUES ('" & idmaga & "','" & "Aggiunta" & "',@data,'" & idPersona & "')"

cmdDB.Parameters.Add("@data", SqlDbType.DateTime).Value = "10/03/2009 12.11.10"



PROBLEMA: dichiarare variabile scalare @data.. fai te

Eh no ! Non è conseguente al mio.

- Anzitutto, perchè metti il nomeTabella fra parentesi quadre ? Io uso lo stesso nomeTabella presente nel DB Sql Server, e funziona benissimo.

- Fai una INSERT mischiando concatenazione con apici singoli, variabili, parameter solo su "data". Perchè mai non fai tutto con i parametri ? Così ti complichi solo la vita inutilmente.

- Che metodo usi su cmdDB per eseguire l'insert ? Io uso .ExecuteNonQuery().

Ce l'ho davanti proprio ora, e ti garantisco che la mia Insert 100% parametrica funziona.

KeySim
13-10-2009, 13:03
te l'ho scritta su.. guarda ora ho messo il codice uguale al tuo papale papale.. stesso errore

Dim str As String = "INSERT INTO CronologiaEventi (Data) VALUES (@data)"

cmdDB.Parameters.Add("@data", SqlDbType.DateTime).Value = "10/03/2009 12.11.10"

Dim cmdDBC As New SqlClient.SqlCommand(str, connDB)

cmdDBC.ExecuteNonQuery()



dichiarare variabile scalare @data.. tutte a me capitano -.-

KeySim
13-10-2009, 13:19
TOMBOLA!!Grazie mille :D:D:D:D:D:D:D:D:D:D ho scoperto l'inghippo XD ora ti spiego..

Dim str As String = "INSERT INTO CronologiaEventi (Data) VALUES (@data)"

cmdDB.Parameters.Add("@data", SqlDbType.DateTime).Value = "10/03/2009 12.11.10"

Dim cmdDBC As New SqlClient.SqlCommand(str, connDB)

cmdDBC.ExecuteNonQuery()

praticamente al posto di scrivere cmdDB devo scrivere cmdDBC che fesso XD e quindi il codice corretto è questo:





Dim str As String = "INSERT INTO CronologiaEventi (Data) VALUES (@data)"

Dim cmdDBC As New SqlClient.SqlCommand(str, connDB)
cmdDBC.Parameters.Add("@data", SqlDbType.DateTime).Value = "10/03/2009 12.11.10"
cmdDBC.ExecuteNonQuery()



:D ora cè l'altro problema da risolvere xD




Però non riesco a resettare l'indice di una tabella.. nel senso che ho messo tanti record di prova, ora li ho cancellati tutti ma l'indice continua dall ultimo che avevo inserito quindi dal 1809° miseriaccia.. ho letto che per azzerare l'indice dovrei usare TRUNCABLE table ma non va.. ho provato con " ALTER TABLE table tabella AUTO_INCREMENT=1 " e mi dice che in prossimità del '=' la sintassi non è corretta.. sai dirmi come fare? >.<

MarcoGG
13-10-2009, 13:21
Per ora posso farti queste domande :

- Che versione di Sql Server usi ? ( Io ho Sql Server 2005 Express senza alcun SP )
- Il DB che usi è frutto di un porting da altro DB ? ( es. da Oracle a Sql... )
- Il campo Data è un campo calcolato ?
- Che vincoli ha il campo Data ?

Per quanto mi riguarda è un tipo di errore "strano", prova anche ad andare su MS e cecare le possibili cause. A me non succede praticamente MAI.

MarcoGG
13-10-2009, 13:23
TOMBOLA!!Grazie mille :D:D:D:D:D:D:D:D:D:D ho scoperto l'inghippo XD ora ti spiego..
...
praticamente al posto di scrivere cmdDB devo scrivere cmdDBC che fesso XD ...


Ma DAAAIII, :doh: :D
Ti meriti un bel :tapiro: d'oro massiccio.

KeySim
13-10-2009, 13:47
eheh ma ascolta per il problema dell ALTER TABLE sai aiutarmi? o qualcun altro può? son disperato miseriaccia perchè il primo problema l'ho risolto.. il 2 idem rimane quello dell alter table..

MarcoGG
13-10-2009, 13:57
Però non riesco a resettare l'indice di una tabella.. nel senso che ho messo tanti record di prova, ora li ho cancellati tutti ma l'indice continua dall ultimo che avevo inserito quindi dal 1809° miseriaccia.. ho letto che per azzerare l'indice dovrei usare TRUNCABLE table ma non va.. ho provato con " ALTER TABLE table tabella AUTO_INCREMENT=1 " e mi dice che in prossimità del '=' la sintassi non è corretta.. sai dirmi come fare? >.<

DBCC CHECKIDENT ('tablename', RESEED, newseed)

Esempio :

DBCC CHECKIDENT ('nomeTabella', RESEED, 1)

Dovrebbe resettare i campi identity di nomeTabella al newseed = 1.

EDIT :
DBCC CHECKIDENT ('nomeTabella', RESEED, 0)
per far iniziare il contatore da 1 al primo inserimento...

KeySim
13-10-2009, 16:57
Grazie di tutto ora funziona tutto alla perfezione ^^ grazie delle dritte, potete chiudere =)