Недопустимая операция с учетом текущего состояния объекта в ExecuteNonQuery () - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь вставить, и в этом случае происходит обновление дубликата ключа. Все из Oracle и использует процедуру, но я получаю эту ошибку, и я не знаю, почему

public static int GrabarJugador(Jugador_E jugador)
    {
        int respuesta = 0;

        try
        {
            conexion = bd.LeerDeBaseDeDatos();

            orden = new OracleCommand();
            orden.CommandText = "CONSULTAS.grabar_jugador";
            orden.CommandType = CommandType.StoredProcedure;
            orden.Parameters.Add("v_nombre", OracleDbType.Varchar2, 60).Value = jugador.Nombre;
            orden.Parameters.Add("v_equipo", OracleDbType.Varchar2, 50).Value = jugador.EquipoJugador;
            orden.Parameters.Add("v_direccion", OracleDbType.Varchar2, 150).Value = jugador.Direccion;
            orden.Parameters.Add("v_puesto", OracleDbType.Varchar2, 2).Value = jugador.PuestoHab;
            orden.Parameters.Add("v_fec_na", OracleDbType.Date).Value = jugador.Fecha;
            orden.Parameters.Add("v_foto", OracleDbType.Blob).Value = jugador.Foto;

            respuesta = orden.ExecuteNonQuery();

            orden.Dispose();

            bd.CerrarConexion();
        }
        catch (Exception e)
        {
            Console.WriteLine("Error " + e.ToString());
            Console.ReadLine();
        }

            return respuesta;
    }

Код процедуры в БД Oracle:

PROCEDURE GRABAR_JUGADOR (v_nombre         VARCHAR,
                          v_equipo         VARCHAR2,
                          v_direccion      VARCHAR2,
                          v_puesto_h       VARCHAR2,
                          v_fec_na         DATE,
                          v_foto        IN BLOB)
IS
BEGIN
    INSERT INTO JUGADOR (NOMBRE,
                         DIRECCION,
                         PUESTO_HAB,
                         FECHA_NAC,
                         EQUIPO_JUGADOR,
                         FOTO_JUGADOR)
         VALUES (v_nombre,
                 v_direccion,
                 v_puesto_h,
                 v_fec_na,
                 v_equipo,
                 v_foto);
EXCEPTION
    WHEN DUP_VAL_ON_INDEX
    THEN
        UPDATE jugador
           SET equipo_jugador = v_equipo,
               direccion = v_direccion,
               puesto_hab = v_puesto_h,
               fecha_nac = v_fec_na,
               foto_jugador = v_foto
         WHERE nombre = v_nombre;

  WHEN OTHERS
    THEN
        raise_application_error (
            -20100,
            'Error inexperado: '|| SQLERRM);
END GRABAR_JUGADOR;

Я пытался, если ошибка для Blob или Date, но это не так. Ошибка появляется только в Orden.ExecuteNonQuery ();

РЕДАКТИРОВАТЬ 1: я исправляю ошибку, была команда в команде, но теперь, когда я вставляю / обновляю проигрыватель картинок (blob), когда я загружаю фотографию, программа выдает мне 1 ошибку: параметр недействителен.

РЕДАКТИРОВАТЬ 2: я видел, что ошибка, когда я сохраняю большой двоичный объект в БД Oracle

if (jugador.Foto != null)
        {
            MemoryStream ms = new MemoryStream();
            ms.Write(jugador.Foto, 0, Convert.ToInt32(jugador.Foto.Length));
            Bitmap bm = new Bitmap(ms, false); //this line break error
            ms.Dispose();
            pictureBox1.Image = bm;
        }

Спасибо за помощь.

1 Ответ

0 голосов
/ 17 ноября 2018

Поскольку вы утверждаете, что решили свою первую проблему, я просто расскажу о нижней (вам, вероятно, следует отредактировать свой вопрос, чтобы он был таким, поскольку первая часть сейчас неактуальна).

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пишете в конец потока, а затем пытаетесь прочитать изображение с концом потока в качестве начальной точки . Вам нужно вернуться к началу потока, прежде чем вы сможете прочитать изображение. Поэтому ваш код должен быть:

if (jugador.Foto != null)
{
    using(MemoryStream ms = new MemoryStream())
    {
        ms.Write(jugador.Foto, 0, Convert.ToInt32(jugador.Foto.Length));
        ms.Seek(0, SeekOrigin.Begin); // seek to the beginning of the stream
        Bitmap bm = new Bitmap(ms, false);
        pictureBox1.Image = bm;
    }
}

Я также переместил MemoryStream в блок using.

Касательные моменты к сведению:

  • Реализация Microsoft MemoryStream означает, что это не проблема, но если вы выполняли запись в файл, или в сетевой сокет и т. Д., Вам, возможно, придется позвонить .Flush(), чтобы убедиться, что данные были отправлены / сохранен и не просто застрял во временном хранилище памяти.
  • Не все потоки являются доступными для поиска, и поэтому имеют свойство CanSeek (в дополнение к CanRead и CanWrite), указывающее, можете ли вы искать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...