Errore sulla restituzione di un valore numerico di una stored

venerdì 08 agosto 2008 - 10.52

trinity Profilo | Guru

ragazzi io ho creato questa stored per ricavare sempre il progressivoschedina massimo dei record salvati in tabella:
ALTER PROCEDURE [dbo].[GetNschedina_new] ( @CodAlbergo Int, @CodComAlbergo Int ) AS BEGIN Select IsNull(max(progschedina),'0')As Nschedina From dbo.archivio_mov_new Where codalbergo=@CodAlbergo AND CodComAlbergo=@CodComAlbergo END

se la eseguo mi funziona perfettamente.
Poi questo dato ovviamente devo caricarlo sul mio applicativo fatto i vb e pertanto eseguo questo codice:

Try SqlCmd.CommandText = "GetNschedina_new" SqlCmd.Parameters.Add("@CodAlbergo", SqlDbType.Int).Value = ObjC59.CodAlbergo SqlCmd.Parameters.Add("@CodComAlbergo", SqlDbType.Int).Value = ObjC59.CodComAlbergo SqlCmd.Connection = Db SqlCmd.CommandType = CommandType.StoredProcedure SqlDr = SqlCmd.ExecuteReader If SqlDr.Read() Then ObjC59.NumeroSchedina = CInt(SqlDr.GetSqlInt32(0) + 1) End If Return ObjC59 Catch ex As Exception Throw ex Finally SqlDr.Close() SqlCmd.Parameters.Clear() SqlCmd.Dispose() End Try

qui il compilatore mi dice il seguente errore:

Cast specificato non valido.

se invece il codice lo imposto cosi:

.....
If SqlDr.Read() Then
ObjC59.NumeroSchedina = CInt(SqlDr.GetSqlValue(0) + 1)
End If
.....

mi funziona ma non posso utilizzarlo in quanto io ho abilitato per una corretta sintassi di codice, l'option strict=On e pertanto il compilatore mi dice:
"Option Strict On non ammette operandi di tipo Object per l'operatore +"

Ora non so se questo post vada bene + per questa sezione o per la sezione .Net ma visto che si tratta anche di sintassi sql l'ho voluta scrivere in questa sezione...non vi arrabbiate
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>ragazzi io ho creato questa stored per ricavare sempre il progressivoschedina
>massimo dei record salvati in tabella:
>
>ALTER PROCEDURE [dbo].[GetNschedina_new]
>(
>@CodAlbergo Int,
>@CodComAlbergo Int
>)
>AS
>BEGIN
>Select IsNull(max(progschedina),'0')As Nschedina From dbo.archivio_mov_new
>Where codalbergo=@CodAlbergo
>AND CodComAlbergo=@CodComAlbergo
>END

Ciao Fabio,

Scusa, se devi restituire un int per quale motivo restituisci un intero result set?
Non puoi utilizzare il valore di ritorno della sp oppure un parametro di output?
Ad esempio:

CREATE PROCEDURE dbo.GetNschedina_new( @CodAlbergo int, @CodComAlbergo int, @ProgSchedina int OUTPUT ) AS SELECT @ProgSchedina = ISNULL(MAX(progschedina),0) FROM dbo.archivio_mov_new WHERE codalbergo = @CodAlbergo AND CodComAlbergo = @CodComAlbergo; GO

A questo punto non devi fare altro che recuperare il parametro di output.
Come? Dai una lettura a questo thread:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=12216

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

D'accordo mi funziona, ma allora perchè in altre stored e funzioni ci sono campi int che mi funzionano facendo il mio metodo e in altri no,
per esempio questa stored:

ALTER PROCEDURE [dbo].[GetSchedine_new] ( @Codalbergo Int, @CodComAlbergo Int, @Data SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT ARC.codalbergo, ARC.codcomalbergo, ARC.progschedina, count(progschedina)As Nrcomp, ARC.dataArrivo, ARC.DataPartenza, ARC.idstato, Nazione=N.Nazione, ARC.idcomune, Comune=C.Comune, Provincia=C.prov, ARC.idgruppo, DescrizioneGruppo=G.Descrizione FROM dbo.Archivio_mov_new ARC JOIN dbo.Nazioni N ON N.CodicePgrStatistica=ARC.Idstato JOIN dbo.Comuni C ON C.codcomune=ARC.idcomune JOIN dbo.Gruppi G ON G.Codicegruppo=ARC.idgruppo WHERE codalbergo=@codalbergo And CodComAlbergo=@CodComAlbergo And dataArrivo =@data Or DataPartenza =@Data Group By codalbergo, codcomalbergo, progschedina, dataarrivo, datapartenza, idstato, nazione, idcomune, comune, prov, idgruppo, Descrizione Order by progschedina,dataarrivo,datapartenza END

funziona ma se la richiamo da questa funzione in vb net:

Public Function CaricaSchedine(ByVal ObjC59 As PropertyC59) As C59Collection Dim C59Coll As New C59Collection SqlCmd.CommandText = "GetSchedine_New" SqlCmd.Parameters.Add("@CodAlbergo", SqlDbType.Int).Value = ObjC59.CodAlbergo SqlCmd.Parameters.Add("@CodComAlbergo", SqlDbType.Int).Value =ObjC59.CodComAlbergo SqlCmd.Parameters.Add("@Data", SqlDbType.SmallDateTime).Value = ObjC59.DataElaborazione Try SqlCmd.Connection = Db SqlCmd.CommandType = CommandType.StoredProcedure SqlDr = SqlCmd.ExecuteReader While SqlDr.Read ObjC59 = New PropertyC59 ObjC59.CodAlbergo = SqlDr.GetSqlInt32(0).Value ObjC59.CodComAlbergo = SqlDr.GetSqlInt32(1).Value ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(2).Value ObjC59.NumeroComponenti = SqlDr.GetSqlInt32(3).Value ObjC59.DataArrivo = CStr(SqlDr.GetSqlDateTime(4).Value) If SqlDr.GetSqlDateTime(5).IsNull = True Then ObjC59.DataPartenza = String.Empty Else ObjC59.DataPartenza = CStr(SqlDr.GetSqlDateTime(5).Value) End If ObjC59.CodStato_Res = SqlDr.GetSqlInt32(6).Value ObjC59.StatoResidenza = SqlDr.GetSqlString(7).Value ObjC59.CodComune = SqlDr.GetSqlInt32(8).Value ObjC59.ComuneResidenza = SqlDr.GetSqlString(9).Value ObjC59.ProvinciaResidenza = SqlDr.GetSqlString(10).Value ObjC59.CodiceGruppo = SqlDr.GetSqlInt32(11).Value ObjC59.DescrizioneGruppo = SqlDr.GetSqlString(12).Value C59Coll.Add(ObjC59) End While Catch ex As Exception Throw ex Finally SqlDr.Close() SqlCmd.Parameters.Clear() SqlCmd.Dispose() End Try Return C59Coll End Function

appena il compilatore passa su:
ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(2).Value
ObjC59.NumeroComponenti = SqlDr.GetSqlInt32(3).Value

mi da l'errore di cui parlo nel post, però i primi campi codalbergo e codcomalbergo sono sempre Int eppure non mi generano errore.

Sai spiegarmi il perchè e come potrei comportarmi secondo il tuo parere?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Sai spiegarmi il perchè e come potrei comportarmi secondo il
>tuo parere?

Guarda, non sono ferratissimo in .NET (e pensare che fino a pochi anni fa ero un Dev con relativa MCSD.NET sia in VB che in C#), ma qual è il data type di progschedina?
Inoltre perché hai messo lo '0' tra apici?
Non vorrei che il risultato venisse castato a stringa.
Prova a toglierli:

Select IsNull(max(progschedina), 0)

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

il discorso del progschedina l'ho risolto ma non riesco a capire perchè

in questa stored:

ALTER PROCEDURE [dbo].[GetSchedine_new] ( @Codalbergo Int, @CodComAlbergo Int, @Data SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT ARC.codalbergo, ARC.codcomalbergo, ARC.progschedina, count(progschedina)As Nrcomp, ARC.dataArrivo, ARC.DataPartenza, ARC.idstato, Nazione=N.Nazione, ARC.idcomune, Comune=C.Comune, Provincia=C.prov, ARC.idgruppo, DescrizioneGruppo=G.Descrizione FROM dbo.Archivio_mov_new ARC JOIN dbo.Nazioni N ON N.CodicePgrStatistica=ARC.Idstato JOIN dbo.Comuni C ON C.codcomune=ARC.idcomune JOIN dbo.Gruppi G ON G.Codicegruppo=ARC.idgruppo WHERE codalbergo=@codalbergo And CodComAlbergo=@CodComAlbergo And dataArrivo =@data Or DataPartenza =@Data Group By codalbergo, codcomalbergo, progschedina, dataarrivo, datapartenza, idstato, nazione, idcomune, comune, prov, idgruppo, Descrizione Order by progschedina,dataarrivo,datapartenza END


progschedina è di tipo Int nella tabella del db come anche il campo codalbergo e codcomalbergo.
eseguo la stored scritta su attraverso questa funzione:


Public Function CaricaSchedine(ByVal ObjC59 As PropertyC59) As C59Collection Dim C59Coll As New C59Collection SqlCmd.CommandText = "GetSchedine_New" SqlCmd.Parameters.Add("@CodAlbergo", SqlDbType.Int).Value = ObjC59.CodAlbergo SqlCmd.Parameters.Add("@CodComAlbergo", SqlDbType.Int).Value =ObjC59.CodComAlbergo SqlCmd.Parameters.Add("@Data", SqlDbType.SmallDateTime).Value = ObjC59.DataElaborazione Try SqlCmd.Connection = Db SqlCmd.CommandType = CommandType.StoredProcedure SqlDr = SqlCmd.ExecuteReader While SqlDr.Read ObjC59 = New PropertyC59 ObjC59.CodAlbergo = SqlDr.GetSqlInt32(0).Value ObjC59.CodComAlbergo = SqlDr.GetSqlInt32(1).Value ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(2).Value ObjC59.NumeroComponenti = SqlDr.GetSqlInt32(3).Value ObjC59.DataArrivo = CStr(SqlDr.GetSqlDateTime(4).Value) If SqlDr.GetSqlDateTime(5).IsNull = True Then ObjC59.DataPartenza = String.Empty Else ObjC59.DataPartenza = CStr(SqlDr.GetSqlDateTime(5).Value) End If ObjC59.CodStato_Res = SqlDr.GetSqlInt32(6).Value ObjC59.StatoResidenza = SqlDr.GetSqlString(7).Value ObjC59.CodComune = SqlDr.GetSqlInt32(8).Value ObjC59.ComuneResidenza = SqlDr.GetSqlString(9).Value ObjC59.ProvinciaResidenza = SqlDr.GetSqlString(10).Value ObjC59.CodiceGruppo = SqlDr.GetSqlInt32(11).Value ObjC59.DescrizioneGruppo = SqlDr.GetSqlString(12).Value C59Coll.Add(ObjC59) End While Catch ex As Exception Throw ex Finally SqlDr.Close() SqlCmd.Parameters.Clear() SqlCmd.Dispose() End Try Return C59Coll End Function

imposto un punto di terruzione di debug per controllare passo passo i dati, appena passa sulla riga:
ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(2).Value

mi si genera un errore di tipo cast non valido, eppure se eseguo la strored in sql management studio funge tranquillamente restituendomi un valore Int (almeno spero) e poi ha lo stesso data type delle colonne codalbergo e codcomalbergo che non mi danno alcun problema
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>ObjC59.CodAlbergo = SqlDr.GetSqlInt32(0).Value
>ObjC59.CodComAlbergo = SqlDr.GetSqlInt32(1).Value
>ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(2).Value
>ObjC59.NumeroComponenti = SqlDr.GetSqlInt32(3).Value

Che data type hanno quelle proprietà di ObjC59?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Tipo int..

Cmq stavo leggendo un pò di info sulla rete e anche nei books online e mi chiedevo percheè io prima non l'ho mai utilizzato nelle mie stored, secondo te che sei un esperto, è più performante richiamare i dati in un'applicazione attraverso dei parametri di output oppure nel modo in cui faccio io ed un esempio sta nelle stored che ti ho postato in questo post....

Ciao fammi sapere
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Tipo int..
Tutti? Mi sembra alquanto strano che in un caso vadano ed in un altro scatenino una eccezione.
Sicuramente ti sfugge qualcosa

>Cmq stavo leggendo un pò di info sulla rete e anche nei books
>online e mi chiedevo percheè io prima non l'ho mai utilizzato
>nelle mie stored, secondo te che sei un esperto, è più performante
>richiamare i dati in un'applicazione attraverso dei parametri
>di output oppure nel modo in cui faccio io ed un esempio sta
>nelle stored che ti ho postato in questo post....
Se ti servono valori scalari (il COUNT() per intenderci) è sciocco generare un result set. Definisci un parametro di OUTPUT in modo da risparmiare risorse lato client, server e banda.

>Ciao fammi sapere
Fatto.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>Tipo int..
>Tutti? Mi sembra alquanto strano che in un caso vadano ed in
>un altro scatenino una eccezione.
>Sicuramente ti sfugge qualcosa


ok controllerò meglio!

>>Cmq stavo leggendo un pò di info sulla rete e anche nei books
>>online e mi chiedevo percheè io prima non l'ho mai utilizzato
>>nelle mie stored, secondo te che sei un esperto, è più performante
>>richiamare i dati in un'applicazione attraverso dei parametri
>>di output oppure nel modo in cui faccio io ed un esempio sta
>>nelle stored che ti ho postato in questo post....
>Se ti servono valori scalari (il COUNT() per intenderci) è sciocco
>generare un result set. Definisci un parametro di OUTPUT in modo
>da risparmiare risorse lato client, server e banda.

e se utilizzassi i parametri output anche per non valori scalari? sarebbe meglio oppure è indifferente?
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>e se utilizzassi i parametri output anche per non valori scalari?
>sarebbe meglio oppure è indifferente?
Semplice, non puoi (nemmeno in SQL Server 2008)

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ok grazie ciao alla prossima
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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