DataReader.RecordsAffect возвращает -1 - PullRequest
1 голос
/ 23 ноября 2011

Я получаю RecordsActed -1 при выполнении следующего кода с использованием Oracle.DataAccess.Client; даже после закрытия Datareader. Но RecordsActed должно быть 1. Пожалуйста, помогите мне исправить эту проблему.

Процедура содержит один оператор выбора, операцию вставки или обновления и возвращаемое значение.

using( OracleConnection conn = new OracleConnection( ConnectionDataContext.SetConnection( ) ) )
            {
                conn.Open( );
                OracleCommand cmd = new OracleCommand( );
                cmd.Connection = conn;
                if( list.MapId == -1 )
                {
                    cmd.CommandText = SpSaveMap;
                }
                else
                {
                    cmd.CommandText = SpUpdateMap;
                }
                cmd.CommandType = CommandType.StoredProcedure;


                OracleParameter [ ] OracleParmeter = new OracleParameter [ 6 ];

                OracleParmeter [ 0 ] = new OracleParameter( "ID", list.MapId );
                OracleParmeter [ 0 ].OracleDbType = OracleDbType.Int32;
                OracleParmeter [ 0 ].Direction = ParameterDirection.InputOutput;
                OracleParmeter [ 1 ] = new OracleParameter( "NAME", list.Name.Trim( ) );
                OracleParmeter [ 1 ].OracleDbType = OracleDbType.Varchar2;
                OracleParmeter [ 2 ] = new OracleParameter( "MAP_WIDTH", list.Width );
                OracleParmeter [ 2 ].OracleDbType = OracleDbType.Double;
                OracleParmeter [ 3 ] = new OracleParameter( "MAP_HEIGHT", list.Height );
                OracleParmeter [ 3 ].OracleDbType = OracleDbType.Double;
                OracleParmeter [ 4 ] = new OracleParameter( "MAP_THEME", list.Theme.Trim( ) );
                OracleParmeter [ 4 ].OracleDbType = OracleDbType.Varchar2;
                OracleParmeter [ 5 ] = new OracleParameter( "MAP_OBJECT_COUNT", list.ObjectCount );
                OracleParmeter [ 5 ].OracleDbType = OracleDbType.Int32;
                foreach( OracleParameter sqlper in OracleParmeter )
                    cmd.Parameters.Add( sqlper );

                OracleDataReader dataReader = cmd.ExecuteReader( );

                if( dataReader.RecordsAffected > 0 )
                {
                    status.ProcedureStatus = true;
                }

               dataReader.Close( );
               status.ReturnValue = cmd.Parameters [ "ID" ].Value.ToString( );
               if( status.ReturnValue == "-2" )
               {
                   status.ProcedureStatus = false;
                   status.ErrorMessage = "Map name is already exist.";
               }
               else
               {
                   status.ProcedureStatus = true;
               }

                cmd.Parameters.Clear( );
                cmd.Dispose( );
                conn.Close( );
            }

PROCEDURE  SP_UPDATE_MAP (
  id IN OUT map.map_id%type, 
  name map.map_name%type,
  map_width map.width%type,
  map_height map.height%type,
  map_theme map.theme%type,
  map_object_count map.object_count%type
  )
  AS
  exist number;
   BEGIN

   PKG_TMS_GET.SP_GET_UPDATE_EXIST_MAP_NAME(name,id, exist);

   IF exist=0 THEN
  /* Update query for map using mapid*/
    UPDATE MAP SET map_name=name,
               width=map_width,
               height=map_height,
               theme=map_theme,
               object_count=map_object_count
        WHERE  map_id=id
    returning map_id INTO ID ;
   ELSIF exist=1 THEN
   RAISE IsNameExist ;
   END IF;

/*Raise user defined exception, no record was effected against upadate statement */
IF SQL%NOTFOUND THEN
  RAISE UpdationFailed ;
END IF;

/*Exception block */
EXCEPTION
WHEN IsNameExist THEN
   ID:=-2; -- -2 means name already exist.

WHEN UpdationFailed THEN
 --dbms_output.put_line('Map updation failed');
  RAISE_APPLICATION_ERROR(-20002,'''Map updation failed'''||' - '||''''||sqlerrm||'''');

WHEN OTHERS THEN
 --RAISE_APPLICATION_ERROR(-20001,'Map updation failed');
 RAISE_APPLICATION_ERROR(-20002,'''Map updation failed'''||' - '||''''||sqlerrm||'''');

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Я считаю, что вы должны использовать

int rows = cmd.ExecuteNonQuery( );

вместо

OracleDataReader dataReader = cmd.ExecuteReader( );

ExecuteNonQuery () даст вам количество затронутых строк.

0 голосов
/ 02 мая 2012

Может быть, вам нужно добавить «установить обратную связь» в текст вашей хранимой процедуры? Я полагаю, что он делает то же самое, что "SET NOCOUNT ON" в T-SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...