给定ExecuteNonQuery()中对象的当前状态,此操作无效

时间:2018-11-17 04:16:27

标签: c# oracle

我正在尝试插入,在这种情况下,存在重复的密钥更新。一切都来自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;
    }

DB 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:我已经看到错误是当我将blob保存在Oracle DB中

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 :(得分:0)

既然您说您已经解决了第一个问题,那么我将只解决最底层的问题(您可能应该将问题编辑为那样,因为第一部分现在不相关了。)

您看到的问题是因为您写到流的末尾,然后尝试以流的末尾作为起点来读取图像。您需要先移回流的开头,然后才能阅读图像。因此,您的代码应为:

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()以确保数据已发送/保存,并且还不仅仅停留在临时内存中。
  • 并非所有Stream都是可搜索的,因此具有CanSeekCanRead之外的CanWrite属性来指示您是否可以搜索。