RETORNAR VALOR ADPARAMOUTPUT DE STORED PROCEDURE

KELLY 09/06/2015 20:54:28
#447567
Boa noite a todos!

Estou tentando retornar o @@Identity com a minha Stored Procedure, mas não está retornando. Em outras aplicações em C# funciona normalmente, mas na minha em VB6 não. Onde estou errando?

Private Sub cmdRegistrar_Click()
Dim res As Integer

Set Comando = New ADODB.Command
With Comando
.ActiveConnection = Conexao
.CommandType = adCmdStoredProc
.CommandText = [Ô]usp_inserir[Ô]
.Parameters.Append .CreateParameter([Ô]empid[Ô], adInteger, adParamOutput)
.Parameters.Append .CreateParameter([Ô]firstname[Ô], adVarChar, adParamInput, 30, txtFirstName.Text)
.Parameters.Append .CreateParameter([Ô]lastname[Ô], adVarChar, adParamInput, 30, txtLastName.Text)
.Parameters.Append .CreateParameter([Ô]hiredate[Ô], adDate, adParamInput, 10, Format(txtHireDate.Text, [Ô]yyyy-MM-dd[Ô]))
.Parameters.Append .CreateParameter([Ô]mgrid[Ô], adInteger, adParamInput, 4, Val(txtMGrid.Text))
.Parameters.Append .CreateParameter([Ô]ssn[Ô], adVarChar, adParamInput, 20, txtSSN.Text)
.Parameters.Append .CreateParameter([Ô]salary[Ô], adCurrency, adParamInput, , txtSalary.Text)
End With

MsgBox Comando([Ô]empid[Ô])

Set Registro = Comando.Execute

Set Comando.ActiveConnection = Nothing
Set Comando = Nothing

Call CarregarTabela

End Sub

Segue o código do meu Stored Procedure:

IF OBJECT_ID([ô]dbo.usp_inserir[ô], [ô]P[ô]) IS NOT NULL
DROP PROC dbo.usp_inserir;
GO

CREATE PROC dbo.usp_inserir
@empid INT OUTPUT,
@firstname VARCHAR(30),
@lastname VARCHAR(30),
@hiredate DATE,
@mgrid INT,
@ssn VARCHAR(20),
@salary MONEY
AS
BEGIN
INSERT INTO Empregados(
firstname,
lastname,
hiredate,
mgrid,
ssn,
salary
)
VALUES(
@firstname,
@lastname,
@hiredate,
@mgrid,
@ssn,
@salary
)
SET @empid = (SELECT @@IDENTITY)
END

OMAR2011 09/06/2015 22:00:55
#447570
Tente assim.
With Comando
.ActiveConnection = conexao
.CommandType = adCmdStoredProc
.CommandText = [Ô]usp_inserir[Ô]
.Parameters.Append .CreateParameter([Ô]empid[Ô], adInteger, adParamOutput)
.Parameters.Append .CreateParameter([Ô]firstname[Ô], adVarChar, adParamInput, 30)
.Parameters.Append .CreateParameter([Ô]lastname[Ô], adVarChar, adParamInput, 30)
.Parameters.Append .CreateParameter([Ô]hiredate[Ô], adDate, adParamInput, 10)
.Parameters.Append .CreateParameter([Ô]mgrid[Ô], adInteger, adParamInput, 4)
.Parameters.Append .CreateParameter([Ô]ssn[Ô], adVarChar, adParamInput, 20)
.Parameters.Append .CreateParameter([Ô]salary[Ô], adCurrency, adParamInput)

.Parameters([Ô]firstname[Ô]) = txtFirstName.Text
.Parameters([Ô]lastname[Ô]) = txtLastName.Text
.Parameters([Ô]hiredate[Ô]) = Format(txtHireDate.Text, [Ô]yyyy-MM-dd[Ô])
.Parameters([Ô]mgrid[Ô]) = Val(txtMGrid.Text)
.Parameters([Ô]ssn[Ô]) = txtSSN.Text
.Parameters([Ô]salary[Ô]) = txtSalary.Text

End With
KELLY 16/08/2015 23:25:28
#450093
Omar, mas e a saída?
LAMPIAO 17/08/2015 10:03:03
#450111
Resposta escolhida
Olá Kelly, abaixo segue a forma que eu usava quando eu usava o VB6, o código abaixo serve pra gerar um número de pedido retornando para a aplicação sempre o próximo número. é só você adaptar e testar ok.

No VB6
  Public Function GetNumeroPedido() As Long

Dim cmd As New ADODB.Command

On Error GoTo Trata_Erro

With cmd
.ActiveConnection = Conexao
.CommandText = [Ô]sp_unicoIds[Ô]
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter([Ô]Return[Ô], adInteger, adParamReturnValue)
.Execute
End With

GetNumeroPedido = cmd(0)

Dispose:

Set cmd = Nothing
Exit Function

Trata_Erro:

GetNumeroPedido = -1
GoTo Dispose

End Function


No SQL Server

CREATE PROCEDURE [dbo].[sp_unicoIds]
AS

IF (SELECT COUNT([SeuCampoDePedidoSequencial]) FROM [SuaTabelaDeNumerosSequencias]) = 0
INSERT INTO [SuaTabelaDeNumerosSequencias] ([SeuCampoDePedidoSequencial]) VALUES(0)

UPDATE [SuaTabelaDeNumerosSequencias]
SET [SeuCampoDePedidoSequencial] = [SeuCampoDePedidoSequencial] + 1
RETURN (SELECT [SeuCampoDePedidoSequencial] FROM [SuaTabelaDeNumerosSequencias])


Abraços
KELLY 17/08/2015 17:41:12
#450141
Gostei da forma como escreveu o seu procedimento armazenado usando RETURN, nunca usei dessa forma.

Obrigada Lampião!

Tópico encerrado , respostas não são mais permitidas