À l'aide de npgsql pour appeler une fonction qui prend un caractère en paramètre
Je suis en train d'utiliser Npgsql pour appeler une fonction (procédure stockée) qui prend un CARACTÈRE en paramètre, mais il ne fonctionne pas. Si je déclare la même fonction sans paramètres, ou avec un paramètre de type ENTIER, j'obtiens le résultat que je veux. Quand je déclarer le paramètre en tant que PERSONNAGE, il s'arrête de fonctionner. Quel est le problème?
Voici le code de ma fonction:
CREATE OR REPLACE FUNCTION testrefcursor1(in xxx character varying(10)) RETURNS SETOF refcursor AS
$$
DECLARE
ref1 refcursor;
ref2 refcursor;
BEGIN
OPEN ref1 FOR
SELECT * FROM accounts;
RETURN NEXT ref1;
OPEN ref2 FOR
SELECT * FROM accounts;
RETURN NEXT ref2;
RETURN;
END;
$$
LANGUAGE plpgsql;
Et voici le code C# que j'utilise:
var connection = new Npgsql.NpgsqlConnection(connectionString.ConnectionString);
connection.Open();
var trans = connection.BeginTransaction();
var command = new Npgsql.NpgsqlCommand("testrefcursor1", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
var parameter = command.CreateParameter();
parameter.ParameterName = "xxx";
parameter.DbType = System.Data.DbType.String;
parameter.Value = "10";
command.Parameters.Add(parameter);
var da = new Npgsql.NpgsqlDataAdapter(command);
var ds = new System.Data.DataSet();
da.Fill(ds);
trans.Commit();
connection.Close();
J'ai déjà essayé de déclarer le paramètre en tant que personnage, PERSONNAGE(10), le CARACTÈRE VARIABLE et le CARACTÈRE VARIABLE(10)...
EDIT: je n'ai pas de message d'erreur, mais au lieu d'obtenir le résultat escompté, je reçois un jeu de résultats vide avec une seule colonne qui a le même nom que la fonction, je suis en train de l'appeler.
OriginalL'auteur Antoine Aubry | 2009-08-19
Vous devez vous connecter pour publier un commentaire.
Vous êtes de passage Unicode argument à une ASCII paramètre.
Modifier cette ligne:
:
Généralement, Postgres est
varchar
les colonnes sont en Unicode, à condition que l'option Unicode sur la base de données est activée (voir ici). Ma conjecture est qu'il ne l'est pas, et votre paramètre est pas en mesure de se convertir dans le type approprié pour être passé au travers de la fonction.Quel est le message d'erreur que vous obtenez?
Je n'ai pas de message d'erreur, mais au lieu d'obtenir le résultat escompté, je reçois un jeu de résultats vide avec une seule colonne qui a le même nom que la fonction, je suis en train de l'appeler.
OriginalL'auteur Eric
Qui Npgsql version utilisez-vous?
Aussi, pouvez-vous préciser le type de paramètre à l'aide de NpgsqlDbType? Parfois, la cartographie n'est pas exactement et Npgsql ne pouvez pas trouver la fonction que vous essayez d'utilisation et ne peut pas le faire fonctionner.
Npgsql essaie de trouver une correspondance exacte du nom de la fonction et des types de paramètres. DbString correspond à du texte les types de paramètre. Auriez-vous l'esprit pour essayer et modifier votre paramètre de type de texte?
J'espère que cela aide.
OriginalL'auteur Francisco Junior
Pas sûr, si cela a à voir avec votre problème, mais hier je suis tombé sur le fait que PostgreSQL a un "octet interne de type" char qui est différente du type char(1). Peut-être il ya une certaine confusion à propos de ces?
Avez-vous adapter votre commande de création de var commande = new Npgsql.NpgsqlCommand("testrefcursor1 (xxx)", connexion); lorsque vous avez utilisé un non vide de la liste des paramètres?
Selon la documentation, je dois préciser que le nom de la fonction: "Si vous avez les paramètres de votre fonction, d'attribuer seulement le nom de la fonction à la propriété CommandText et ajouter des paramètres à la NpgsqlCommand.Collection de paramètres comme d'habitude. Npgsql prendra soin de liaison de vos paramètres correctement." npgsql.projects.postgresql.org/docs/manual/UserManual.html
Si vous regardez le texte après le h3-rubrique "Utilisation de paramètres dans une requête" et la définition de la première NpgsqlCommand dans l'exemple suivant, je dirais qu'il vaut la peine d'essayer d'utiliser :xxx
OriginalL'auteur
J'ai essayé avec le ci-dessous approche (qui est semblable à la vôtre):
Cela fonctionne bien pour moi et je suis de bonne DataTable.
OriginalL'auteur Shivendu Srivastava