Problemi con un SQLParameter

venerdì 17 ottobre 2008 - 13.19

gabriel81 Profilo | Junior Member

Ciao a tutti!!
io ho una Stored procedure che trova le spese in base a fornitore periodo di tempo e range di spesa:

CREATE PROC [dbo].[SP_FindSpese]

@F_DtDa smalldatetime = '01/01/1970',
@F_DtA smalldatetime = '31/12/2050',
@F_Fornitore nvarchar(50) = '',
@F_ImportoDa smallmoney = 0,
@F_ImportoA smallmoney = 214748
AS

BEGIN
SET NOCOUNT ON;
SELECT [RagSociale],[DataSpesa],[Importo]

FROM [dbo].[Spese]
WHERE [RagSociale] LIKE '%' + @F_Fornitore + '%'
AND [DataRifFornitore] BETWEEN @F_DtDa AND @F_DtA
AND [Importo] BETWEEN @F_ImportoDa AND @F_ImportoA
END

Ho messo dei valori di default che in teoria annullerebbero ogni filtro restituendo tutte le righe.
Questi valori di default da SQL Management funzionano.

In VB.net, la costruzione dei parametri la faccio dinamicamente mediante una classe che tramite:

SELECT PARAMETER_NAME AS Nome,PARAMETER_MODE AS Direzione
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE SPECIFIC_NAME=@StoredProcedure

si crea un Datatable con i parametri e poi ciclando su di essi va a prendere i dati sul form creando la collezione di parametri del comando.
Questa classe ha sempre funzionato fino ad oggi.
Ora succede una cosa stranissima:
tutti i parametri funzionano correttamente tranne il parametro @F_ImportoA smallmoney = 214748
Esso infatti viene intercettato, trova il textbox corretto e viene aggiunto alla collezione di parametri del comando sql.
Però se sul form immetto un valore qualsiasi, la sp restituisce le righe in base al criterio di ricerca.
Se sul form NON metto niente nel campo "ImportoA" non restituisce niente!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Il bello è che il parametro "F_ImportoDa" è identico e funziona!!!!!!


Ho provato ad aggiungere manualmente:

_cmd.Parameters.Item("@F_ImportoA").Value = Nothing
e in questa maniera funziona
Però mentre per @F_ImportoDa in valore Textbox.text viene accettato e ben interpretato, per @F_ImportoA questo non succede (eppure la classe è la stessa).

Inoltre se da SQL Management provo ad eseguire la sp passando a @F_ImportoA un valore NULL non funziona, mentre se non gli passo nessun valore, la sp restituisce righe....
SONO AVVILITO!!!

dano91 Profilo | Newbie

scusa so che sono un incapace è non ti sarò di alun aiuto ma magari tu potresti esserlo x me...
ho bisogno dei frameworks . net e non riesco a trovarli...
o meglio li trovo sul sito della microsoft ma poi non riesco a passarli su di un altro computer potresti aiutarmi????
grazie

gabriel81 Profilo | Junior Member

Credo che dovresti aprire un nuovo thread....qui è off topic.
Se no poi ti sgridano!!

alexmed Profilo | Guru

Ciao
Provo ad azzardare la risposta
>Se sul form NON metto niente nel campo "ImportoA" non restituisce niente!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Se sulla TextBox non metti NULLA passi al parametro un valore String = "" e non un valore Null

E se gli metti 0 (zero)? Funziona?

In caso affermativo dovresti fare in modo che se la lunghezza della stringa della TextBox è = 0 (zero) allora imposti il paramtro a
>_cmd.Parameters.Item("@F_ImportoA").Value = Nothing

Ciao

alx_81 Profilo | Guru

>Ciao a tutti!!
Ciao!

>CREATE PROC [dbo].[SP_FindSpese]
>
>@F_DtDa smalldatetime = '01/01/1970',
>@F_DtA smalldatetime = '31/12/2050',

>Ho messo dei valori di default che in teoria annullerebbero ogni filtro restituendo tutte le righe.
>Questi valori di default da SQL Management funzionano.
Già qui avrei da dire.. Non usare i formati localizzati per le date. Usa sempre il formato ISO "SSAAMMGG HH:MM:SS.nnn"
http://www.mcs.vuw.ac.nz/technical/software/SGML/doc/iso8601/ISO8601.html

>si crea un Datatable con i parametri e poi ciclando su di essi
>va a prendere i dati sul form creando la collezione di parametri
>del comando.
Piuttosto che un datatable, sempre pesante, usa una list of SQLParameters.

>tutti i parametri funzionano correttamente tranne il parametro
>@F_ImportoA smallmoney = 214748
>Esso infatti viene intercettato, trova il textbox corretto e
>viene aggiunto alla collezione di parametri del comando sql.
>Però se sul form immetto un valore qualsiasi, la sp restituisce
>le righe in base al criterio di ricerca.
>Se sul form NON metto niente nel campo "ImportoA" non restituisce
>niente!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Per fare in modo che usi il default, non devi passare il parametro, oppure devi fare la chiamata con "default". Quello che posso consigliarti è di controllare con il metodo String.IsnullOrEmpty(string) se la textbox è valorizzata o meno e se non la è, non creare il parametro. Così sei sicuro che chiama il default.

Ciao.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

alx_81 Profilo | Guru

>scusa so che sono un incapace è non ti sarò di alun aiuto ma
>magari tu potresti esserlo x me...
>ho bisogno dei frameworks . net e non riesco a trovarli...
>o meglio li trovo sul sito della microsoft ma poi non riesco
>a passarli su di un altro computer potresti aiutarmi????
dano91, mi raccomando, segui il consiglio di gabriel81 cerca la stanza corretta la prossima volta
eccoti un link per i download dei .Net fx:
http://msdn.microsoft.com/en-us/netframework/aa569263.aspx

>grazie
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

WOW!! Quanti interventi!
Ora devo avere il tempo di digerire tutto..
Faccio le opportune prove e poi vi dico!

P.S.: Per il consiglio sul formato delle date ho già provveduto!
Grazie 1000!

gabriel81 Profilo | Junior Member


> Piuttosto che un datatable, sempre pesante, usa una list of SQLParameters.

Non avrei idea di come fare..
Se i parametri della Stored procedure li prendo da SQL Server, lui mi restituisce un Datatable per forza:
il datatable ha 3 colonne che sono "nome","tipo" e "direzione"
e le righe rappresentano i vari parametri con le descrizioni di tipo e direzione

Dovrei quindi riconvertire il Dt in array?
Non appesantisco il processo aggiungendo una conversione che prima non c'era?
Ti chiedo perchè il mio primo target riguarda le performance, quindi se c'è una maniera per velocizzare le operazioni provo subito.

alx_81 Profilo | Guru

>
>> Piuttosto che un datatable, sempre pesante, usa una list of SQLParameters.
>
>Non avrei idea di come fare..
>Se i parametri della Stored procedure li prendo da SQL Server,
>lui mi restituisce un Datatable per forza:
>il datatable ha 3 colonne che sono "nome","tipo" e "direzione"
>e le righe rappresentano i vari parametri con le descrizioni
>di tipo e direzione
Invece che farti tornare un datatable, cicla il datareader (ExecuteReader) e lavora su quello.. DataTable lo torna perchè tu vuoi che lo torni
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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