簡體   English   中英

Npqsql存儲過程返回多個REFCURSOR

[英]Npqsql Stored Procedure Returns Multiple REFCURSOR

我在使用Npgsql從.NET / C#調用存儲過程時遇到一些問題。 從操作已經進行到現在可用的行到列超出范圍的時間,我有時會遇到不同的錯誤,該錯誤必須在0到0之間。但是,這是我從NUnit中看到的主要堆棧跟蹤。

System.InvalidOperationException : An operation is already in progress.

   at Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState)
   at Npgsql.NpgsqlConnector.ExecuteInternalCommand(SimpleFrontendMessage message, Boolean withTimeout)
   at Npgsql.NpgsqlConnector.Rollback()
   at Npgsql.NpgsqlTransaction.Rollback()
   at Omega.Data.DAO.PatientShapeDao.GetShapeData(Int64 shapeId) in c:\Users\jkratz\Projects\omega\Omega\data\DAO\PatientShapeDao.cs:line 62
   at Omega.Tests.DAO.PostgresDaoTests.TestGetShapeData() in c:\Users\jkratz\Projects\omega\Omega.Tests\DAO\PostgresDaoTests.cs:line 26

我在Postgres中有以下存儲過程:

CREATE OR REPLACE FUNCTION public.getpatientshapedata(p_shapeid bigint)
  RETURNS SETOF refcursor AS
$BODY$
    DECLARE
        v_shapecursor REFCURSOR;
        v_shapefilecursor REFCURSOR;
    BEGIN

      OPEN v_shapecursor FOR
        select * from patientshape where id = p_shapeid;
      RETURN NEXT v_shapecursor;

      OPEN v_shapefilecursor FOR
        select * from patientshapefile where patientshapeid = p_shapeid;
      RETURN NEXT v_shapefilecursor;

    END;
$BODY$
  LANGUAGE plpgsql

此刻它返回兩個反射器。

我的應用程序中有以下Dao對象。

public class PatientShapeDao
    {
        private NpgsqlConnection _dbHandle;
        private readonly string _connectionString;

        public PatientShapeDao()
        {
            OmegaConnectionString connectionString = Transform.getInstance.LoadOmegaConnection();

            _connectionString = string.Format("Server={0};User Id={1};Password={2};Database={3}", 
                connectionString.Host, connectionString.UserId, connectionString.Password, connectionString.Database);
        }

        public void GetShapeData(long shapeId)
        {
            NpgsqlTransaction transaction;

            // open connection
            _dbHandle = new NpgsqlConnection(_connectionString);
            _dbHandle.Open();

            // begin transaction
            transaction = _dbHandle.BeginTransaction();

            try
            {
                // call stored procedure
                NpgsqlCommand command = new NpgsqlCommand("getpatientshapedata", _dbHandle);
                command.Parameters.Add(new NpgsqlParameter("p_shapeid", shapeId));
                command.CommandType = CommandType.StoredProcedure;
                NpgsqlDataReader dataReader = command.ExecuteReader();

                // read result sets
                while (dataReader.Read())
                {
                    Console.WriteLine("{0}\t{1}", dataReader[0], dataReader[1]);
                }

                dataReader.NextResult();

                // read result sets
                while (dataReader.Read())
                {
                    Console.WriteLine("{0}\t{1}", dataReader[0], dataReader[1]);
                }

                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
            }
            finally
            {
                _dbHandle.Close();
            }
        }
    }

您的堆棧跟蹤顯示異常是從Rollback拋出的,這意味着您的代碼中有一些更早的異常尚未發布。

無論如何,您都需要將NpgsqlCommand和NpgsqlDataReader放置在using中,以便在到達catch塊之前將它們正確處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM