Postgres entier tableaux comme paramètres?
Je comprends que, dans Postgres pure, vous pouvez passer un tableau d'entiers dans une fonction, mais que ce n'est pas pris en charge dans le .NET fournisseur de données Npgsql.
J'ai actuellement un DbCommand dans lequel je charge un appel à une procédure stockée, vous devez ajouter un paramètre et d'exécuter scalaire pour récupérer un Id pour remplir un objet avec.
Elle doit maintenant prendre la n des entiers comme des arguments. Ils sont utilisés pour créer des enregistrements enfants reliant l'enregistrement récemment créé par id pour les arguments entiers.
Idéalement, j'aimerais mieux ne pas avoir à faire de multiples ExecuteNonQuery des appels sur mon DbCommand pour chacun des entiers, donc je suis sur le point de construire un csv chaîne comme un paramètre qui sera partagé sur le côté de la base de données.
J'ai l'habitude de vivre dans LINQ 2 SQL en savourant la Db de l'abstraction, de travailler sur ce projet avec un manuel d'accès aux données, il est tout simplement d'obtenir un peu sale, comment les gens vont habituellement sur le passage de ces types de paramètres dans postgres?
- Pour ceux qui ne lisent que les réponses sélectionnées: Tableau de paramètres sont pris en charge avec le .NET Npgsql fournisseur (bien que je ne peux pas dire si c'était vrai quand la question a été posée). Voir mon réponse.
Vous devez vous connecter pour publier un commentaire.
Voir: http://www.postgresql.org/docs/9.1/static/arrays.html
Si votre pilote non-natif ne fonctionne toujours pas vous permettre de passer des tableaux, vous pouvez alors:
passer une chaîne de caractères de la représentation d'un tableau (que votre procédure stockée peut ensuite analyser dans un tableau -- voir
string_to_array
)puis
avec :1 =
'1,2,3,4'
compter sur Postgres lui-même à lancer une chaîne en un tableau
puis
choisir de ne pas utiliser des variables de liaison et d'émettre une commande explicite de la chaîne avec tous les paramètres énoncés à la place (assurez-vous de valider ou d'échapper à tous les paramètres venant de l'extérieur pour éviter les attaques par injection SQL.)
puis
PREPARE
à moins que les commandes préparées sont activés (parfois explicitement) et, dans certains cas, si un certain nombre d'exécutions seuil a été dépassé pour une commande. Si la commande de la journalisation est activée danspostgresql.conf
ensuite, vous verrez la réelleSELECT
/INSERT
/etc. commandes les commandes préparées ne sont PAS utilisés.Je réalise que c'est une vieille question, mais il m'a fallu plusieurs heures pour trouver une bonne solution et j'ai pensé passer sur ce que j'ai appris ici sauver quelqu'un d'autre le mal. Essayez, par exemple,
où @id_list est lié à un int[] paramètre par
où la commande est une NpgsqlCommand (à l'aide de C# et Npgsql dans Visual Studio).
Vous pouvez toujours utiliser une chaîne formatée correctement. Le truc, c'est la mise en forme.
command.Parameters.Add("@array_parameter", string.Format("{{{0}}}", string.Join(",", array));
Notez que si votre tableau est un tableau de chaînes de caractères, alors vous aurez besoin d'utiliser un tableau.Sélectionnez(valeur => string.Format("\"{0}\", valeur)) ou l'équivalent. J'ai utiliser ce modèle pour un tableau d'un type énuméré dans PostgreSQL, car il n'y a pas de conversion automatique de la matrice.
Dans mon cas, mon type énuméré a certaines valeurs comme 'valeur1', 'valeur2', 'valeur3', et mon C# énumération a des valeurs correspondantes. Dans mon cas, la dernière requête SQL finit par ressembler à (E'{"valeur1","valeur2"}'), et cela fonctionne.