ObcException

giovedì 27 agosto 2009 - 15.56

paolope Profilo | Newbie

Sono in vb.2005


Ho delle difficola su una procedura che funziona correttamente su diverse macchina sia xp che win 2000
, al contrario su una macchina appena riformattata win2000 sp4 , quando apro il programma mi esce questo errore

Io mi collego al database mysql con i drive odbc , ho installato su questa macchina il framework 2.0 SP1, e anche il language pack
o disistallato i drive odbc almeno un paio di volte facendo ovviamnete anche il test di connessione che risulta positivo


Stop cercando di risolvere questa problematica di odbcexception
Allora il database quando lo apro non mi da problemi

Dim Con_Str1 As String = "DATABASE=WEBAGENTI;DESCRIPTION=MySQL ODBC 3.51
Driver
DSN;DSN=WEBAGENTI;OPTION=2051;PORT=3306;SERVER=xxx.xxx.xxx.xxx;UID=root"
Dim ConWeb As New OdbcConnection(Con_Str1)

MessageBox.Show("APRO IL DATABASE")
ConWeb.Open()

SQLSelect = "SELECT * FROM PASS "
SQLSelect += "WHERE UTEN_NOME = '" & Txutente.Text.Trim & "' AND "
SQLSelect += "UTEN_PSW = '" & Txpassword.Text.Trim & "' "
Dim cmd As New OdbcCommand(SQLSelect, ConWeb)

PASSO = cmd.ExecuteReader
If PASSO.HasRows = False Then
MessageBox.Show(" Password o utente errati ")
PASSO.Close()
Exit Sub
End If
MessageBox.Show("faccio la read")
PASSO.Read()

il problema si verifica soltato sulla lettura di certi campi ad esempio se
leggo
PASSO("UTEN_NOME") il programma risponde perfettamente se invece prendo ad
esempio un'altro campo (che non ha nulla di particolare ) e che fa cmq parte
della query
PASSO("UTEN_TIPO") allora il programma mi da quell'errore indicibile che ho
riportato anche nelle mail precedenti
allora mi chiedo cosa possa differenziare un campo dall'altro e come posso
io risolvere questa problematica ?
avere delle Idee a riguardo anche un solo consiglio ...


grazie 1000
Paolo




System.Data.Odbc.OdbcException
at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcDataReader.GetData(Int32 i, SQL_C sqlctype, Int32 cb, Int32& cbActualOut)
at System.Data.Odbc.OdbcDataReader.internalGetString(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
at System.Data.Odbc.DbCache.AccessIndex(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
at System.Data.Odbc.OdbcDataReader.get_Item(String value)
at Ordini_Server.Pass_Agente.Button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.PerformClick()
at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.Control.PreProcessMessage(Message& msg)
at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg)
at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)



R3GM4ST3R Profilo | Junior Member

Ciao, due consigli :
1) Questo codice è un po' troppo pericoloso, nel senso che se nelle caselle di testo mettono qualche carattere strano, sei passibile di sqlinjection et simla, quindi ti consiglio di usare i commandtext parametrici tipo :

string strExec = "INSERT INTO [TABELLA] (PAR1,PAR2,PAR3)VALUES(@PAR1,@PAR2,@PAR3)";

SqlParameter Parametro1 = new SqlParameter("@PAR1", SqlDbType.NVarChar, 50);
SqlParameter Parametro2 = new SqlParameter("@PAR2", SqlDbType.NVarChar, 50);
SqlParameter Parametro3 = new SqlParameter("@PAR3", SqlDbType.NVarChar, 50);

//Ora imposti un valore ad ogni parametro per fare un esempio...
Parametro1.Value = textbox1.Text;
Parametro2.Value = textbox2.Text;
Parametro3.Value = textbox3.Text;

//Poniamo il caso che il command sia CMD, gli aggiungi i parametri appena impostati per passare i valori al posto di concatenarli con + & etc etc
CMD.Parameters.Add(Parametro1);
CMD.Parameters.Add(Parametro1);
CMD.Parameters.Add(Parametro1);
//Poi la esegui normalmente come fai adesso CMD.executereader() etc etc

Per quanto riguarda il tuo errore, potrebbe essere dato da un problema di incompatibilità tra tipi di dato, una cosa del tipo che stai tentando di leggere un intero, oppure un valore NULL e lo stai impostando come stringa.Al massimo usa il metodo .tostring() alla fine dell'oggetto item del datareader esempio :
PASSO("UTEN_TIPO").tostring()

Se fai il debug passo a passo puoi vedere dove si incastra...

Ciao

P.S. L'esempio è con gli sqlparameter ma ci dovrebbero essere anche per odbc
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

paolope Profilo | Newbie

Ti ringrazio per l'immediata risposta , per quanto riguarda il mio errore il campo che sto cercano di visualizzare
e un semplicissimo campo char(1) , dove non ci sono campi nulli e tanto meno vuoti , la cosa strana è che negli altri pc questo problema non succede, ne tanto meno sulla mia macchina dove posso si fare il debug.
provero come mi hai consigliato tu di inserire tostring

grazie 1000
Paolo




paolope Profilo | Newbie

Ciao..
Ho appena fatto questo tentativo di inserire il tostring ma il risultato non cambia
e putroppo come dicevo nel tread precedente non posso fare il debug in quanto è una macchina client
Ho provato a installare e disintallare il software diverse volte anche i drive odbc di mysql
non so che pesci prendere ...

paolope Profilo | Newbie

Buon giorno .. allora ho finalmente risolto ..
il problema era sul mdac durante l'installazione io ho installato la versione 2.6 , installando invece la versione 2.8 sp1 il problema e scomparso
ringrazio tutti per l'attenzione e l'aiuto che mi avete fornito

saluti
Paolo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5