2015-07-25 3 views
0

Я использую Postgres 9.4 и NpgSql 2.2.5 для моего .Net-приложения. Postgres новичок для меня и когда я пытаюсь выполнить функцию postgres в базе данных, она бросает меня ошибкаЧтение записей из базы данных с использованием NpgSql и Postgres 9.4

Вот мой C# код

public List<District> DistrictReadAll() 
     { 
      try 
      { 
       List<District> districts = new List<District>(); 
       using (var conn = new NpgsqlConnection(this.RealEsateDB)) 
       { 
        conn.Open(); 
        using (var cmd = conn.CreateCommand()) 
        { 
         cmd.CommandText = "district_read_all"; 
         cmd.CommandType = System.Data.CommandType.StoredProcedure;      
         NpgsqlDataReader rdr = cmd.ExecuteReader(); 
         while (rdr.Read()) 
         { 
          District objDist = new District(); 
          objDist.DistrictId = (int)rdr["districtid"]; 
          objDist.Name = rdr["name"].ToString(); 
          districts.Add(objDist); 
         } 
         return districts; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
     } 

функция Postgres

create or replace function district_read_all() 
returns refcursor 
as 
$$ 
declare 
    ref1 refcursor ; 
begin 
    open ref1 for 
    select districtid,name from district order by name asc; 
return ref1; 
end 
$$ language plpgsql; 

определение public.district таблица

CREATE TABLE district 
(
    districtid serial NOT NULL, 
    name character varying(250) NOT NULL, 
    activeflag boolean DEFAULT true, 
    CONSTRAINT pk_district_districtid PRIMARY KEY (districtid) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE district 
    OWNER TO postgres; 

И ошибка # C StackTrace

Npgsql.NpgsqlException was caught 
    HResult=-2147467259 
    Message=ERROR: 34000: cursor "<unnamed portal 1>" does not exist 
    Source=Npgsql 
    ErrorCode=-2147467259 
    BaseMessage=cursor "<unnamed portal 1>" does not exist 
    Code=34000 
    ColumnName="" 
    ConstraintName="" 
    DataTypeName="" 
    Detail="" 
    ErrorSql=SELECT * FROM district_read_all() 
    File=src\backend\commands\portalcmds.c 
    Hint="" 
    Line=168 
    Position="" 
    Routine=PerformPortalFetch 
    SchemaName="" 
    Severity=ERROR 
    TableName="" 
    Where="" 
    StackTrace: 
     at Npgsql.NpgsqlState.<ProcessBackendResponses>d__0.MoveNext() 
     at Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) 
     at Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() 
     at Npgsql.ForwardsOnlyDataReader.NextResultInternal() 
     at Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) 
     at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) 
     at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) 
     at Npgsql.NpgsqlCommand.ExecuteReader() 
     at CarRental.DataAccess.DistrictAccess.DistrictReadAll() in c:\DotNetApplications\CarRentalGit\RJ.CarRental\CarRental.DataAccess\DistrictAccess.cs:line 58 
    InnerException: 

Это очень простая вещь, если я использую Sql Server

Может кто-нибудь, дайте мне знать, что я здесь делаю неправильно?

ответ

2

Вам необходимо обернуть и выполнить запрос в пределах NpgsqlTransaction, чтобы он работал - см. Раздел руководства Using refcursors.

using (var conn = new NpgsqlConnection(this.RealEsateDB)) 
{ 
    conn.Open(); 

    using (NpgsqlTransaction t = conn.BeginTransaction()) 
    { 
     using (var cmd = conn.CreateCommand()) 
     { 
      ... 
     } 

     t.Commit(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^