2 votes

Comment déterminer la propriété de taille des paramètres de sortie de procédure stockée dans la couche d'accès aux données C#

J'ai créé une couche d'accès aux données librement inspirée de l'implémentation ActiveRecord du projet Castle. Pour qu'elle soit acceptée, elle doit prendre en charge la vaste bibliothèque de procédures stockées utilisées dans mon organisation, qui ont été écrites pour utiliser toutes les structures d'entrée/sortie imaginables, y compris les valeurs de retour et les paramètres de sortie de tous les types de données possibles.

Mon problème réside dans le développement du code qui ajoute le paramètre de sortie à la collection de paramètres de l'objet Command utilisé pour exécuter la procédure stockée. En ce moment, j'utilise simplement une grande valeur par défaut, en espérant qu'elle suffira à couvrir tous les cas, mais cela me semble négligé.

Comment puis-je connaître la longueur du paramètre de sortie à l'avance ?

Voici ma classe DAL, utilisant des attributs pour indiquer le paramètre de sortie :

 [StoredProcedure("usp_PostARTransaction", OperationType.Insert)]
    public class ARTranPost : DataObjectBase
    {
        [StoredProcedureParameter("sARTranID",OperationType.Insert,ParameterDirection.Output)]
        public string ARTranID {get;set;}
        [StoredProcedureParameter("sDueDate", OperationType.Insert, ParameterDirection.Input)]
        public string DueDate { get; set; }
        [StoredProcedureParameter("sPostDate", OperationType.Insert, ParameterDirection.Input)]
        public string PostDate { get; set; }

    }

Dois-je utiliser SMO ou une autre bibliothèque pour obtenir la longueur depuis la base de données?

3voto

devio Points 22981

Si vous travaillez sur SQL Server (non spécifié dans OP), vous pouvez utiliser les vues catalogues sysobjects et syscolumns pour récupérer les procédures stockées et leurs paramètres :

SELECT p.name, t.name, c.*
FROM sysobjects p
INNER JOIN syscolumns c ON p.id = c.id
INNER JOIN systypes t on c.xusertype = t.xusertype
WHERE p.type = 'P'
AND p.name NOT LIKE 'dt[_]%'
ORDER BY p.name, c.colid

(dans SQL2005+ utiliser sys.objects, sys.types et sys.columns, mais les anciennes vues sont toujours là)

Cela vous donne le nom de la procédure, le nom du type, le nom du paramètre, la longueur et la direction d'entrée/sortie (c.isoutparam).

J'ai écrit sur mon blog sur générer un accès SP pour C#. Je n'ai pas couvert les paramètres OUT là-bas, mais ajuster le code pour les paramètres de sortie devrait être simple.

1voto

Cyberherbalist Points 4564

Le paramètre de sortie dans votre procédure stockée a un type de données / taille. Utilisez cela.

Si votre SP est comme suit :

create procedure DoThis
    @parm1 int
    , @parm2 varchar(50) output
as

select @parm2 = (
select breed from dogs
where dogid = @parm1
)

Vous savez ce que le paramètre de sortie est. Appelez-le

public string DoThis(int dogid)
{
    SqlCommand cmd = new SqlCommand("DoThis");
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = theConnection;

    cmd.Parameters.Add(new SqlParameter("@parm1", dogid);
    cmd.Parameters["@parm1"].DbType = DbType.Int32;

    cmd.Parameters.Add(new SqlParameter("@parm2", DbType.String, 50));
    cmd.Parameters["@parm2"].Direction = ParameterDirection.Output;

    db.ExecuteNonQuery(cmd);

    return (string) cmd.Parameters["@parm2"];

}

0voto

gbn Points 197263

Vous devez examiner le code SQL. Ou réfléchir (et mettre en cache)

Modifier : Il y a des techniques mises en évidence ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X