Mit npgsql zu nennen, eine Funktion, der Charakter als parameter
Ich versuche, mit Npgsql zum aufrufen einer Funktion (gespeicherte Prozedur), das dauert ein ZEICHEN als parameter übergeben, aber es funktioniert nicht. Wenn ich erkläre die gleiche Funktion ohne Parameter oder mit einem INTEGER-parameter, bekomme ich Ergebnisse, die ich will. Wenn ich deklarieren Sie den parameter als ZEICHEN, es funktioniert. Was ist falsch?
Hier ist der code meiner Funktion:
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;
Und hier ist der C# - code, die ich benutze:
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();
Ich habe bereits versucht die Deklaration der parameter als CHARAKTER, CHARAKTER(10), CHARACTER VARYING CHARACTER VARYING(10)...
EDIT: ich bekomme keine Fehlermeldung, aber anstatt das erwartete Ergebnis eingestellt, bekomme ich eine leere Ergebnismenge mit einer einzigen Spalte, die den gleichen Namen wie die Funktion, die ich bin versucht zu rufen.
InformationsquelleAutor Antoine Aubry | 2009-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist die übergabe eines Unicode-argument, um eine ASCII-parameter.
Ändern Sie diese Zeile:
:
Allgemein -, Postgres-s
varchar
Spalten sind in Unicode, vorausgesetzt, dass die Unicode-option für die Datenbank aktiviert ist (siehe hier). Meine Vermutung ist, dass es nicht so ist und Ihr parameter ist nicht in der Lage zu konvertieren, sich selbst in den richtigen Typ übergeben werden, durch die Funktion.Was ist die Fehlermeldung, die Sie bekommen?
Ich bekomme keine Fehlermeldung, aber anstatt das erwartete Ergebnis eingestellt, bekomme ich eine leere Ergebnismenge mit einer einzigen Spalte, die den gleichen Namen wie die Funktion, die ich bin versucht zu rufen.
InformationsquelleAutor Eric
Welche Npgsql version verwenden Sie?
Außerdem können Sie angeben, den Typ des Parameters mit NpgsqlDbType? Manchmal ist die Zuordnung nicht genau und Npgsql nicht finden können, die Funktion, die Sie verwenden möchten, und nicht, damit es funktioniert.
Npgsql versucht, eine genaue übereinstimmung mit der Funktion, die Namen und parameter-Typen. DbString entspricht text, der parameter-Typen. Hätten Sie etwas dagegen, es zu versuchen, und ändern Sie den parameter type auf text?
Ich hoffe, es hilft.
InformationsquelleAutor Francisco Junior
Nicht sicher, ob dies hat zu tun mit dem problem, aber gestern stolperte ich über die Tatsache, dass PostgreSQL hat eine "single-byte-internen Typ" char, der sich von dem Typ char(1). Vielleicht gibt es einige Verwirrung über diese?
Hast du anpassen Ihr Befehl der Schöpfung zu var command = new Npgsql.NpgsqlCommand("testrefcursor1(:xxx)", Verbindung);, wenn Sie verwendet ein nicht leerer parameter-Liste?
Laut Dokumentation, sollte ich geben Sie nur den Namen der Funktion: "Wenn Sie Parameter in die Funktion, weisen Sie nur den Namen der Funktion, um die CommandText-Eigenschaft und fügen Sie Parameter hinzu, um die NpgsqlCommand.Parameter-Auflistung wie üblich. Npgsql kümmern verbindlich Ihre Parameter korrekt." npgsql.projects.postgresql.org/docs/manual/UserManual.html
Wenn man sich den text nach der h3-überschrift "Verwenden von Parametern in einer Abfrage" und die definition der ersten NpgsqlCommand im folgenden Beispiel, ich würde sagen, einen Versuch ist es Wert verwenden :xxx
InformationsquelleAutor
Habe ich versucht mit dem unten Ansatz (die ist ähnlich wie deine):
Dies ist in Ordnung für mich und ich bin immer in der richtigen DataTable.
InformationsquelleAutor Shivendu Srivastava