29 messaggi dal 20 gennaio 2004
allora sono cotto!!, non riesco a recuperare i parametri di output che mi restituisce un file di classe.
(sp_inerimento)
AS
IF EXISTS
(
SELECT
..........
WHERE,,,,,,,,= @,,,,,,, )
Return 1
ELSE
INSERT INTO ....... (
)
VALUES
(
@ModelNumber,
)
SELECT

@ProductId = @@Identity

--------------------------




...dopo aver passato i parametri di imput cerco di recuperare 2 parametri di output posti in un componente esterno

------------------------Classe.vb---------
Dim parameterPID As New SqlParameter("@ProductId", SqlDbType.Int, 4)
parameterPID.Direction = ParameterDirection.Output
myCommand.Parameters.Add(parameterPID)

Dim parameterRET As New SqlParameter("@ModelNumber", SqlDbType.Int, 4)
parameterRET.Direction = ParameterDirection.Output
myCommand.Parameters.Add(parameterRET)

Try

myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()

Dim RET As Integer = CInt(parameterRET.Value)
If RET = 0 Then
Return RET.ToString()
Else
Return String.Empty
End If

Dim productId As Integer = CInt(parameterPID.Value)
Return productId.ToString()

Catch
Return String.Empty
End Try

End Function
-------------------------------------------
Ok
Poi ho il form:Isert.aspx.vb---------------
---------------------
InsertProdotti.InsertProdotti _
(CStr(Server.HtmlEncode(TxtCod.Text.Trim)), _
CStr(Server.HtmlEncode(TxtMod.Text.Trim)),

.....-------------------
ma come recupero i parametri di output sul form?
ParameterRET serve per fare il controllo che il prodotto non ci sia già
E il parametro dell' id "productID" lo vorrei mostrare a video se l'inserimenbto va a buon fine.

graie ciao
Io cambierei approccio. Una idea potrebbe essere questa...

STORED PROCEDURE:

[...]
DECLARE @productId INT
DECLARE @count INT

SET @productId = 0
SET @count = (SELECT count(*) FROM Products WHERE ...) 

-- Se non esiste, inserisci.
IF(@count = 0)
BEGIN
INSERT...
SET @productId = @@IDENTITY
END

SET @count = (SELECT count(*) FROM Products WHERE ...)

IF (@count = 0)
SELECT -1 AS Result
ELSE
SELECT @productId AS Result
GO


Ritorna un valore scalare intero che vale:
-1 se non viene eseguito nessun inserimento e nessun record è presente nella tabella;
0 se non viene eseguito nessun inserimento e il record è già presente nella tabella;
n>0 se viene eseguito l'inserimento nella tabella.

CODICE:

[...]
Dim pid as Integer
[...]
myConnection.Open()
[...] 
pid = myCommand.ExecuteScalar() 
[...]
myConnection.Close() 
If (pid > 0) Then
Return pid.ToString() 'Inserimento avvenuto
Else
Return String.Empty 'Nessun inserimento
End If
[...]


Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
29 messaggi dal 20 gennaio 2004
Si andrebbe bene anzi meglio, anche perchè ho solo un valore da recuperare, ma così non ho il numero di id prodotto da stampare a video.
in pratica viene fuori così:

[....]
................
myCommand.Parameters.Add(parameterIva)
Dim pid As Integer
Try
myConnection.Open()
myCommand.ExecuteNonQuery()
pid = myCommand.ExecuteScalar()
myConnection.Close()
If pid > 0 Then
Return pid.ToString
End If
Catch
Return String.Empty
End Try
End Function
------
Poi sul form aspx:
[...]
Dim InsertProdotti As new namespace.classe
Dim pid As String
if pid <>""
'insereisco i dati
Giusto?
ciao grazie
No, usa solo ExecuteScalar(). Infatti la stored procedure ti ritorna un numero. Non devi usare ExecuteNonQuery().

Devi gestire anche il caso in cui pid<=0.

Ciao, Ricky.
Modificato da rickyvr il 22 ottobre 2004 11.14 -

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
29 messaggi dal 20 gennaio 2004
Ok ma :
Dim pid As Integer

myConnection.Open()
pid = myCommand.ExecuteScalar()
myConnection.Close()

If pid > 0 Then
Return pid.ToString
Else

Return String.Empty
If pid <= 0 Then
Return String.Empty
End If
End If

e cosi mi inserisce o meno i dati(a parte la schifezza del de secondo if ma solo per capire) ma come faccio a prelevare il numero restituito dalla variabile "pid" sulla pagina .aspx?
ti metto come è scritto il codice
------------DBlogig.vb------------------------------
Public Function InsertProdotti(ByVal ModelNumber As String, ByVal ModelName As String, _
ByVal ProductImage As String, ByVal ThumbImage As String, ByVal UnitCost As Decimal, ByVal netto As Decimal, _
ByVal description As String, ByVal Disponibilita As Integer, ByVal news As Boolean, _
ByVal promo As Boolean, ByVal CategoryId As Integer, ByVal IdFornitore As Integer, _
ByVal IdSubCat As Integer, ByVal iva As Integer) As Integer
[connessione e parametri]
Dim pid As Integer

myConnection.Open()
pid = myCommand.ExecuteScalar()
myConnection.Close()

If pid > 0 Then
Return pid.ToString
Else

Return String.Empty
If pid <= 0 Then
Return String.Empty
End If
End If
------------------------------------------
---------file.aspx.vb----------------------------------
Private Sub BntUpdt_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BntUpdt.Click
Dim InsertProdotti As HP.garage.ProdDB = New HP.garage.ProdDB
InsertProdotti.InsertProdotti _
[....]
(DdlIva.SelectedValue)
End Sub
Quello che hai scritto nella funzione InsertProdotti non va bene. Scrivi in questo modo:

[...]

If pid > 0 Then 
Return pid.ToString()
Else 
Return String.Empty 
End If
End Function


La funzione HP.garage.ProdDB.InsertProdotti(...) restituisce quindi un valore di tipo String.

Per quanto riguarda la seconda questione, non è ben chiaro cosa tu voglia fare. Se non ho capito male, tu vuoi fare visualizzare il PID una volta effettuato l'inserimento, giusto? Spero di avere capito bene... In questo caso basta assegnare il valore ritornato dalla funzione per esempio alla proprietà Text di una Label direttamente dentro l'handler dell'evento di click:

[...]

Dim s As String = InsertProdotti(...)
If s <> "" Then
myLabel.Text = "Inserito il prodotto con ID " & s
Else
myLabel.Text = "Nessun prodotto inserito"
End If

[...]


Ovviamente da qualche parte nella pagina ASPX deve essere presente la Label con ID=myLabel. In questo modo puoi visualizzare l'esito dell'operazione. Esistono altre soluzioni equivalenti, questo è solo un esempio per farti capire su come utilizzare il valore ritornato dalla funzione di inserimento.

Ciao, Ricky.
Modificato da rickyvr il 22 ottobre 2004 22.14 -

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.