none
ExecuteScalar non mi restituisce il valore, dove sbaglio?? RRS feed

  • Discussione generale

  • Dovendo estrarre un valore da una tabella e dovendo ripetere questa operazione più volte ho impostato e risolto il problema nel modo seguente:

    Scrivo la query Es.

    QryS = "SELECT Ordinato FROM Articoli WHERE Codice=12345"

    e lo passo alla seguente Function:

    Public Function QryScalar(ByVal QryS As String) As String
            QryScalar = -1
            Dim QryScalarCMD As New SqlClient.SqlCommand
            QryScalarCMD.Connection = DbConn
            QryScalarCMD.CommandText = QryS
            DbConn.Open()   ' Apri la connessione al Db
            QryScalar = QryScalarCMD.ExecuteScalar()   ' Esegui la Qry
            DbConn.Close()  ' Chiudi la connessione al Db
        End Function

    dopo aver scritto:

    TextBox1.Text = QryScalar(QryS)

    ma TextBox1.text non viene mai valorizzato.

    Nessun aiuto neanche dal debug.

    Potete darmi una mano a capire dove ho sbagliato.??

    grazie matylda

    martedì 13 novembre 2012 15:21

Tutte le risposte

  • Ummamma che complicazione...

    Ma in quel papocchio di codice, il risultato 'ndove te lo ritorni?

    Ovvero... un RETURN Risultato, dove lo fai?

    E poi usare un Option Strict ON?

    P.s. La query  "SELECT Ordinato FROM Articoli WHERE Codice=12345" non ti restituisce uno scalare, ma una tabella.




    • Modificato DavideB72 martedì 13 novembre 2012 16:22
    martedì 13 novembre 2012 15:53
  • Ovvero... un RETURN Risultato, dove lo fai?

    Anche se non è bellissimo, in VB .NET puoi assegnare al nome della funzione il valore di ritorno, e questo sarà restituito alla fine della funzione come se facessi una Return (è un'eredità di VB6).

    P.s. La query  "SELECT Ordinato FROM Articoli WHERE Codice=12345" non ti restituisce uno scalare, ma una tabella.

    Come si può leggere qui: http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executescalar.aspx, il metodo ExecuteScalar restituisce il valore della prima colonna della prima riga del risultato.

    Matylda, quando dici che non hai avuto nessun aiuto dal debug, cosa intendi? A provato ad eseguire la funzione QryScalar in modalità passo-passo? Hai verificato che valore ottieni in risposta da ExecuteScalar?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    martedì 13 novembre 2012 16:42
  • Anche se non è bellissimo, in VB .NET puoi assegnare al nome della funzione il valore di ritorno, e questo sarà restituito alla fine della funzione come se facessi una Return (è un'eredità di VB6).

    "Non è bellissimo" credo che sia un complimento... 

    A parte che eseguire una query scalare parametrica non si fa così, a parte che... gestione delle eccezioni questa sconosciuta e che comunque prima di aprire una connessione bisognerebbe controllarne lo stato, a parte l'assegnare il valore -1 ad una stringa, che poi non è una stringa vera ma il risultato di una funzione, a parte che il risultato di una ExecuteScalar è un Object, a parte che... tutto ciò detto

    Come si può leggere qui: http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executescalar.aspx, il metodo ExecuteScalar restituisce il valore della prima colonna della prima riga del risultato.

    il fatto che io possa non ricevere un errore facendo una castroneria, o meglio, un'operazione insensata proprio perchè può dare un risultato non predicibile non mi sembra un bene ma un male.

    martedì 13 novembre 2012 17:55
  • grazie per la segnalazione. Ho provveduto, ma ora mi genera un "errore di conversione da nvarchar a numeric" nell'esecuzione dell'executescalar. Il dato nella tabella del Db è definito come nvarchar, ho provato diverse strade ma senza risultato, cosa si deve fare?

    Grazie

    martedì 13 novembre 2012 19:07
  • grazie per la segnalazione. Ho provveduto, ma ora mi genera un "errore di conversione da nvarchar a numeric" nell'esecuzione dell'executescalar. Il dato nella tabella del Db è definito come nvarchar, ho provato diverse strade ma senza risultato, cosa si deve fare?

    Il messaggio mi sembra autoesplicativo. Anche perchè se tu che hai la struttura del DB sotto mano. Detto questo, banalmente, la query fatta eseguire con un management (ad esempio per SqlServer usando il SSMSEE) funziona oppure ti da errore?

    Il DATO definito come nvarchar è CODICE oppure ORDINATO... perchè se disgraziatamente fosse CODICE, quell'errore è assolutamente normale.


    • Modificato DavideB72 martedì 13 novembre 2012 20:33 Aggiunta.
    martedì 13 novembre 2012 20:25
  • grazie per la segnalazione. Ho provveduto, ma ora mi genera un "errore di conversione da nvarchar a numeric" nell'esecuzione dell'executescalar. Il dato nella tabella del Db è definito come nvarchar, ho provato diverse strade ma senza risultato, cosa si deve fare?

    Il messaggio mi sembra autoesplicativo. Anche perchè se tu che hai la struttura del DB sotto mano. Detto questo, banalmente, la query fatta eseguire con un management (ad esempio per SqlServer usando il SSMSEE) funziona oppure ti da errore?

    Il DATO definito come nvarchar è CODICE oppure ORDINATO... perchè se disgraziatamente fosse CODICE, quell'errore è assolutamente normale.


    grazie, tutti i campi dti tutte le tabelle sono definiti come nvarchar ad eccezzione delle chiavi che sono int32. Quello che qui viene chiamato CODICE non è una chiave primaria che è un codice articolo alfanumerico e che comunque non è duplicato in ogni caso, per questa ragione la query è stata scritta in quel modo.

    L'aver definito tutti i campi come nvarchar quali vincoli mi comporta? cambiare le definizioni non è un grosso problema, ma perchè dovrei farlo? non ci sono altre strade?

    grazie

    martedì 13 novembre 2012 21:41
  • Hai provato ad eseguire la query da fuori, ovvero da un management?

    Se si, probabilmente ti ha dato lo stesso errore. Questo significherebbe che il testo della query e' sbagliato, ma questo e' un problema di sql e non di visual basic. Il valore di un parametro varchar nella clausola where va incluso tra apici, quindi "where Codice ='12345'". Se e' un nvarchar dovresti mettere un N prima del primo apice.

    martedì 13 novembre 2012 22:39
  • Hai provato ad eseguire la query da fuori, ovvero da un management?

    Se si, probabilmente ti ha dato lo stesso errore. Questo significherebbe che il testo della query e' sbagliato, ma questo e' un problema di sql e non di visual basic. Il valore di un parametro varchar nella clausola where va incluso tra apici, quindi "where Codice ='12345'". Se e' un nvarchar dovresti mettere un N prima del primo apice.

    Scusa per il ritardo ma ho avuto un problema + urgente. E' giusto, servono gli apici anche se il parametro è una stringa, questa è una mia bestiale dimenticanza! Ora funziona, OVVIAMENTE, anche se il valore restituito contiene tutti i caratteri blank, ovvero non viene 'trimmato'. Verdrò cosa posso fare.

    grazie, matylda

    giovedì 15 novembre 2012 15:56
  • Se hai eseguito la query in un management dovresti anche capire il perchè (probabilmente ti darà due righe)...

    giovedì 15 novembre 2012 20:29
  • Se hai eseguito la query in un management dovresti anche capire il perchè (probabilmente ti darà due righe)...

    Scusa la mia ignoranza, ma cosa intendi per mangement?. Ho provato la query con un generatore di Qry e il risultato non cambia. Non sò se è possibile inserire una funzione tipo Trim nella Qry (Trim non è riconosciuta), non ho righe doppie e nel Db, dopo una prova di cambio di struttura del campo da nvarchar a char, che non ha portato a nessun cambiamento, il campo è stato riportato a nvarchar. Non capisco perchè facendo la Qry da SQL server il tutto funziona in modo corretto.

    Non è un problema vitale per la prosecuzione dello sviluppo, ma mi piacerebbe capire

    Grazie matylda

    venerdì 16 novembre 2012 16:38
  • Invece credo che tutto vada capito, perchè quello che non capisci prima o poi finisce per fregarti.

    Ciò detto, credo che per arrivare a capo della questione in maniera efficace la soluzione più rapida sia quella di fare due prove su una copia del tuo DB (a proposito, quale motore usi?), proprio perchè non essendo medico ma informatico, le diagnosi a distanza o per telefono non sono il mio forte.

    Per management intendo il Front End che comunica con il motore e sul quale provi le query prima di integrarle nel tuo programma. Per Sql Server Express esite il SSMSEE ovvero Sql Server Management Studio Express Edition o lo SQUEL (che è decisamente più "LIGHT" anche e soprattutto come pesantezza nell'installazione), per VistaDB il VistaDB Data Builder etc.

    lunedì 19 novembre 2012 07:52