[英]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.