簡體   English   中英

給定ExecuteNonQuery()中對象的當前狀態,此操作無效

[英]Invalid operation given the current state of the object in ExecuteNonQuery()

我正在嘗試插入,在這種情況下,存在重復的密鑰更新。 一切都來自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;
        }

謝謝你幫我

既然您說您已經解決了第一個問題,那么我將只解決最底層的問題(您可能應該將您的問題編輯為那樣,因為第一部分現已不相關)。

您看到的問題是因為您寫入流的末尾,然后嘗試以流的末尾為起點讀取圖像。 您需要先移回流的開頭,然后才能閱讀圖像。 因此,您的代碼應為:

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塊中。

切線注意事項:

  • 微軟對MemoryStream的實現意味着這不是問題,但是如果您正在寫入文件或網絡套接字等,則可能必須調用.Flush()來確保數據已發送/保存.Flush()存在仍然不僅僅停留在臨時存儲中。
  • 並非所有Stream都是可搜索的,因此具有CanSeek屬性(除了CanReadCanWrite )可指示您是否可以搜索。

暫無
暫無

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

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