我正在尝试插入,在这种情况下会出现重复的密钥更新。一切都来自 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 还是日期,但不是这个。该错误仅在 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()
以确保数据已发送/保存并且不会被卡住在临时内存中。CanSeek
属性(除了CanRead
和CanWrite
)来指示您是否可以搜索。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句