Directorio
2. Conflicto de tipo de operando: nvarchar es incompatible con la imagen
Anímate todos los días, vamos!
1. Introducción
Recientemente, estoy trabajando en un proyecto de C # basado en el marco MVC. Descubrí que el terminal web necesita transferir la información del usuario a la base de datos guardada en segundo plano y obtenerla de los datos y luego hacerla eco en la interfaz web. La información contiene imágenes. Algunas preguntas, grabe aquí
2. Conflicto de tipo de operando: nvarchar es incompatible con la imagen
Descripción del problema
Al enviar la información de front-end, hay una imagen que no se cargó. Este problema se produce al escribir en la base de datos. El tipo de imagen en la base de datos es imagen.
La causa del problema
Si la base de datos es del tipo Imagen, cuando se ejecuta la instrucción de inserción, si el valor insertado es DBNull.Value, solicita: Conflicto de tipo de operando: nvarchar es incompatible con la imagen; la razón de este problema es la razón para no especificar DbType. En la mayoría de los casos, al usar SqlParameter, no es necesario especificar el tipo de datos del parámetro (DbType o SqlDbType). ADO.Net determinará automáticamente el tipo de datos de acuerdo con el tipo de valor. Incluso si ADO.Net no puede determinarlo, el servidor de base de datos SQLServer puede Aproveche al máximo el juicio (por supuesto, se perderá algo de rendimiento).
Pero para el tipo de imagen en este programa, no tengo tanta suerte. Si no se especifica DbType y los datos son Null / DbNull, ado.net reconoce el tipo de datos como nvarchar, y se produce el error anterior. Tan solo especifique DbType o SqlDbType.
Solución
nuevo SqlParameter ("@ Photo", SqlDbType.Image) {Value = recrument.PASSPORT}
3. La consulta parametrizada en C # '(@ imagen PERSONAL_PHOTO, @ SURNAME nvarchar (4000), @ MIN_NAME nvarcha' requiere el parámetro '@PASSPORT', pero no se proporciona el parámetro.
Descripción del problema
Después de resolver el problema anterior, apareció un nuevo problema, la imagen aún no se subió, por lo que reclutamiento.PASSPORT = null
Causa del problema
Piense directamente en nulo en C # como nulo en sql, por lo que se considera que el parámetro no se proporciona
Solución
Nulo en C # no es lo mismo que nulo en SQL. El nulo en SQL se expresa en C # como DBNull.Value
nuevo SqlParameter ("@ Photo", SqlDbType.Image) {Value = TableSqlCon.TODBNull (recrument.PASSPORT)}
public static object TODBNull(byte[] image)
{
if (image != null)
{
return image;
}
else
{
return DBNull.Value;
}
}
4. Al obtener datos de imagen de la base de datos, me encontré con el problema de cómo determinar si los datos de imagen obtenidos son nulos
Descripción del problema
Los datos de la imagen obtenidos de los datos se verán obligados a convertirse al tipo byte [], como reclutamiento. PASAPORTE = (byte []) dt.Rows [0] [21]; pero cuando la imagen está vacía, se informa un error: el sistema no se puede utilizar. DBNull se convierte en byte [], y luego trato de juzgar si está vacío, si (dt.Rows [0] [21]! = Null) y otros intentos, todos fallan
Solución
Escritura correcta: if (dt.Rows [0] [21] es System.DBNull)
if (dt.Rows[0][21] is System.DBNull)
{
recruitment.PASSPORT = null;
}
else
{
recruitment.PASSPORT =(byte[]) dt.Rows[0][21];
}
Referencia
https://blog.csdn.net/kaixin_5200_kaixin/article/details/23115953
https://blog.csdn.net/weixin_30270889/article/details/97839671