187 votes

Comment passer des paramètres de valeur de table à une procédure stockée depuis un code .net ?

J'ai une base de données SQL Server 2005. Dans quelques procédures, j'ai des paramètres de table que je transmets à une procédure stockée en tant qu'élément d'information. nvarchar (séparés par des virgules) et les diviser en valeurs individuelles. Je l'ajoute à la liste des paramètres de la commande SQL comme ceci :

cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";

Je dois faire migrer la base de données vers SQL Server 2008. Je sais qu'il existe des paramètres de valeur de table, et je sais comment les utiliser dans les procédures stockées. Mais je ne sais pas comment en passer un à la liste des paramètres dans une commande SQL.

Est-ce que quelqu'un connaît la syntaxe correcte de la Parameters.Add procédure ? Ou existe-t-il un autre moyen de transmettre ce paramètre ?

0 votes

Consultez cette solution : Procédure stockée avec paramètre évalué par la table dans EF. code.msdn.microsoft.com/Stored-Procedure-with-6c194514

0 votes

Dans un cas comme celui-ci, j'ai l'habitude de concaténer des chaînes de caractères et de les diviser du côté du serveur ou de passer même un xml si j'ai plusieurs colonnes. Sql est très rapide lors du traitement du xml. Vous pouvez essayer toutes les méthodes et vérifier le temps de traitement et après cela choisir la meilleure méthode. Un XML ressemblerait à <Items><Item value="sdadas"/><Item value="sadsad"/>...</Items>. Le processus sur Sql Server est également simple. En utilisant cette méthode, vous pouvez toujours ajouter un nouvel attribut à <item> si vous avez besoin de plus d'informations.

4 votes

@NituAlexandru, "Sql c'est très rapide quand on traite du xml.". Pas du tout.

1voto

bside Points 127

Utilisez ce code pour créer un paramètre approprié à partir de votre type :

private SqlParameter GenerateTypedParameter(string name, object typedParameter)
{
    DataTable dt = new DataTable();

    var properties = typedParameter.GetType().GetProperties().ToList();
    properties.ForEach(p =>
    {
        dt.Columns.Add(p.Name, Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType);
    });
    var row = dt.NewRow();
    properties.ForEach(p => { row[p.Name] = (p.GetValue(typedParameter) ?? DBNull.Value); });
    dt.Rows.Add(row);

    return new SqlParameter
    {
        Direction = ParameterDirection.Input,
        ParameterName = name,
        Value = dt,
        SqlDbType = SqlDbType.Structured
    };
}

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