Pourquoi mon ms stocké proc ne renvoie qu'un entier (et comment le modifier)

Salut J'utilise vs2008 faire une application asp.net.vb. La procédure stockée suivante insiste résolument sur le renvoi d'un entier. D'un autre côté, j'espérais et j'attendais qu'un seul nom soit rendu. Quelqu'un peut-il aider à modifier le sp ou décrire ce que je dois faire pour get le résultat que je désire.

ALTER PROCEDURE [dbo].[getusername] ( @email varchar , @retvalue nvarchar (10)output ) AS SET NOCOUNT ON SELECT myemailaddress FROM newtable WHERE (myemailaddress = @email) 

Merci pour tout et toute aide.

Le code de return pour une procédure stockée est toujours un entier. Vous pouvez le définir en utilisant l'instruction Return dans votre procédure comme ceci:

Return 9

Il n'y a aucun moyen de renvoyer autre chose qu'un entier en utilisant le code de return de la procédure. Si vous voulez utiliser votre paramètre de sortie, vous devez le définir:

 Select @retValue = somecolumn From newTable Where myemailaddress = @email 

UNE ADDITION

Voici un petit script de test:

 Create Table dbo.NewTable ( MyEmailAddress varchar(30) not null Primary Key ) Insert dbo.NewTable(MyEmailAddress) Values('[email protected]') Insert dbo.NewTable(MyEmailAddress) Values('[email protected]') Insert dbo.NewTable(MyEmailAddress) Values('[email protected]') GO Create Procedure dbo.GetUserName @Email varchar(30) , @RetValue nvarchar(10) OUTPUT As Set NoCount On; Select @RetValue = Cast(MyEmailAddress As nvarchar(10)) From dbo.NewTable Where MyEmailAddress = @Email Return GO Declare @ProcValue nvarchar(10) exec dbo.GetUserName '[email protected]', @ProcValue OUTPUT Select @ProcValue exec dbo.GetUserName '[email protected]', @ProcValue OUTPUT Select @ProcValue 

Peut-être avez-vous une erreur de syntaxe dans votre script?

Je soupçonne que l'entier dont vous parlez est en fait la valeur de return de la procédure stockée et non le paramètre de sortie @retvalue.

Mettre à jour

En regardant le SQL dans votre question et le code dans votre commentaire ci-dessous, vous rencontrez ce problème sous deux angles légèrement différents.

Si vous utilisez cmd.ExecuteScalar, il returnnera la première colonne de la première ligne de l' SELECT de votre procédure stockée (en regardant votre procédure stockée, il s'agirait de myemailaddress ). Ceci est renvoyé en tant object DataType. Par conséquent vous devez modifier retvalue = cmd.ExecuteScalar à retvalue = Convert.ToSsortingng(cmd.ExecuteScalar)

Si vous utilisez cette technique, la déclaration @retvalue nvarchar (10)output dans votre procédure stockée n'est pas nécessaire.

Pour être honnête, cette solution est un peu ghetto, une route plus propre serait d'utiliser output parameters de output dans votre procédure stockée et ensuite au lieu de retvalue = cmd.ExecuteScalar utilisez cmd.ExecuteNonQuery et ensuite ramasser la valeur du paramètre de output comme la valeur de retvalue = Convert.ToSsortingng(cmd.Parameters("@retvalue").Value) . C'est ce que Thomas dans une autre réponse implique en utilisant son interprétation de votre procédure stockée.

Ce que nous avons vraiment besoin de voir, c'est le code VB qui appelle le proc stocké. Si vous faites un DataAdapter.Fill (jeu de données), vous obtiendrez les résultats de l'instruction SELECT dans le DataSet.

Exemple de code:

 Dim cmd As New SqlCommand Dim ds As New DataSet Dim dataAdatpter As SqlDataAdapter = Nothing ' Nothing assignment removes warning message Dim mustCloseConnection As Boolean = False PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters, mustCloseConnection) ' Create the DataAdapter & DataSet dataAdatpter = New SqlDataAdapter(cmd) ' Fill the DataSet using default values for DataTable names, etc dataAdatpter.Fill(ds) 

Eh bien, je l'ai fait, je ne sais pas pourquoi cela fonctionne et mes autres efforts n'ont pas, mais merci à tous ceux qui ont pris le time de répondre. Mon code ressemble maintenant à ceci.

 ALTER PROCEDURE [dbo].[getusername] ( @email varchar (50) , 

@retvalue varchar (50) sortie)

COMME

SET NOCOUNT ON

SELECT myname FROM newtable OERE (myemailaddress = @Email)

et les trucs vb comme ça

 Dim email = value Dim con = New SqlConnection() Dim connectionSsortingng = My.Resources.textssortingngs.dbconnect con.ConnectionSsortingng = connectionSsortingng con.Close() con.Open() Dim cmd As SqlCommand cmd = New SqlCommand() With cmd .Connection = con .CommandType = CommandType.StoredProcedure .CommandText = "getusername" .Parameters.AddWithValue("@email", value) Dim retvalue As New SqlParameter("@retvalue", SqlDbType.VarChar, 50) retvalue.Direction = ParameterDirection.Output .Parameters.Add(retvalue) End With username = cmd.ExecuteScalar() 

Merci encore.