2009-08-21 8 views
0

Ma procédure stockée est comme ceci.Comment obtenir le paramètre de sortie de sql dans codebehind

ALTER PROCEDURE [dbo].[GetImagesByDesignId] 
     @DesignID bigint, 
     @RegID bigint, 
     @PageIndex INT, 
     @NumRows INT, 
     @ImageCount INT OUTPUT 
    AS 

BEGIN 

    SELECT @ImageCount=(SELECT COUNT(*) FROM DocManagement where [email protected] and [email protected]) 

    Declare @startRowIndex INT; 
    set @startRowIndex = (@PageIndex * @NumRows) + 1; 

    With ImageEntries as (
     SELECT ROW_NUMBER() OVER (ORDER BY DocumentID ASC) as Row, RegID, DesignID,ImageName 
     FROM DocManagement 
     WHERE [email protected] and [email protected] 
    ) 

    Select RegID, DesignID,ImageName 
    FROM ImageEntries 
    WHERE Row between 
    @startRowIndex and @[email protected] 

END 

J'appelle StoredProcedure dans mon codebehind comme

Dim dt As DataTable = objUpload.GetDocuments(lngRegID, lngDesignID) 
      dlView.DataSource = dt 
      dlView.DataBind() 

dlView est datalist.Method GetDocuments est écrit dans une autre classe comme celui-ci

Public Function GetDocuments(ByVal lngRegID As Long, ByVal lngDesID As Long) As DataTable 
      Try 

       Dim db As Database = DatabaseFactory.CreateDatabase() 
       Dim DbCommand As DbCommand = db.GetStoredProcCommand("GetImagesByDesignId") 
       db.AddInParameter(DbCommand, "@RegID", DbType.Int64, lngRegID) 
       db.AddInParameter(DbCommand, "@DesignID", DbType.Int64, lngDesID) 
       db.AddInParameter(DbCommand, "@PageIndex ", DbType.Int32, intPageIndex) 
       db.AddInParameter(DbCommand, "@NumRows ", DbType.Int32, intNumRows) 
       db.AddOutParameter(DbCommand, "ImageCount", DbType.Int32, 250) 
       Return db.ExecuteDataSet(DbCommand).Tables(0) 
       Dim strOutput() As String = {db.GetParameterValue(DbCommand, "ImageCount").ToString} 

      Catch ex As Exception 
      End Try 

     End Function 

problème est que je veux datattable comme ainsi que l'imagecount dans codebehind.Comment puis-je retourner datatable et imagecount à codebehind.Can quelqu'un peut-il aider?

Répondre

2

Vous pouvez créer une classe à utiliser qui est une valeur de retour qui contient à la fois la table de données et le nombre d'images. Ou vous pouvez envoyer une variable comme argument par référence:

Public Function GetDocuments(ByVal regID As Long, ByVal desID As Long, ByRef imageCount As Integer) As DataTable 

Dans la méthode, vous venez de définir la valeur de imageCount.

Dans votre procédure stockée, vous n'avez pas besoin d'une requête imbriquée pour obtenir le nombre. Il suffit de faire comme ceci:

select @ImageCount = count(*) 
from DocManagement 
where DesignID = @DesignID and RegID = @RegID 

Note:
Je vois que vous avez un bloc Catch sans rien dedans. Jamais faites cela. Vous attrapez des exceptions et les ignorez, cela ne peut que conduire à des problèmes.

Dans les rares cas où vous avez réellement besoin d'attraper une exception et de l'ignorer, vous devriez au moins avoir un commentaire dans le bloc Catch expliquant pourquoi il est ignoré.

En outre, vous attrapez la classe de base Exception, quand vous devriez attraper une classe plus spécifique comme SqlException.

1
Public Function GetDocuments(ByVal lngRegID As Long, ByVal lngDesID As Long, ByRef strOutput As String) As DataTable 

Vous pouvez utiliser ByRef et passer une variable de chaîne comme une référence et le mettre dans votre méthode. La référence de strOutput sera transmise à votre méthode et lorsque vous définissez la valeur de cette variable dans la méthode, vous pouvez récupérer la valeur modifiée après l'appel de la méthode.

Dim strOutput As String = Nothing 
Dim dt As DataTable = GetDocuments(lngRegID, lngDesID, strOutput) 
Console.WriteLine(strOutput) 
Questions connexes