¿Por qué no puedo insertar DBNull.Value en un campo de imagen que acepta valores NULL en SQL Server 2005?
-
13-11-2019 - |
Pregunta
¿Por qué no puedo insertar? DBNull.Value
en un anulable image
-campo en el servidor SQL 2005?
Probé este código:
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=PrescriptionTrackingSystem;Integrated Security=True");
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
SqlCommand command = new SqlCommand(@"INSERT INTO Customer(
ID
,Name
,TelephoneNumber
,DateOfBirth,
InsuranceProvider,
PolicyNumber,Photo)
VALUES(
@ID
,@Name
,@TelephoneNumber
,@DateOfBirth,
@InsuranceProvider,
@PolicyNumber,
@Photo)", conn);
command.Transaction = transaction;
command.Parameters.AddWithValue("@ID", 1000);
command.Parameters.AddWithValue("@Name", item.Name);
command.Parameters.AddWithValue("@TelephoneNumber", item.TelephoneNumber);
if (item.DateOfBirth != null)
{
command.Parameters.AddWithValue("@DateOfBirth", item.DateOfBirth);
}
else
{
command.Parameters.AddWithValue("@DateOfBirth", DBNull.Value);
}
command.Parameters.AddWithValue("@InsuranceProvider", item.InsuranceProvider);
command.Parameters.AddWithValue("@PolicyNumber", item.PolicyNumber);
if (item.Photo != null)
{
command.Parameters.AddWithValue("@Photo", item.Photo);
}
else
{
command.Parameters.AddWithValue("@Photo", DBNull.Value);
}
int count = command.ExecuteNonQuery();
transaction.Commit();
conn.Close();
el artículo es de tipo Customer
.
public class Customer
{
public string Name { get; set; }
public DateTime? DateOfBirth { get; set; }
public string TelephoneNumber { get; set; }
public string InsuranceProvider { get; set; }
public int? PolicyNumber { get; set; }
public byte [] Photo { get; set; }
}
Al insertar me sale esta excepción:
Operand type clash: nvarchar is incompatible with image
Por qué DBNull.Value
tiene problemas solo con image
?¿Por qué no con datetime
?
Solución
Podrías probar esto:
command.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;
Otros consejos
Creo que esto podría tener que ver con el hecho de que no está definiendo explícitamente SqlParameter.SqlDbType y creo que asumirá NVARCHAR.En lugar de usar AddWithValue, intente agregar un nuevo SqlParameter y configurar SqlDbType explícitamente en SqlDbType.Image.
Aquí esta la referencia de MSDN que indica que el valor predeterminado es NVARCHAR.
Debe especificar explícitamente el tipo de parámetro como SqlDbType.Image
Resolví esto así:
If (Photo.Equals(DBNull.Value)) Then
cmd.Parameters.Add("Photo", SqlDbType.Image).Value = DBNull.Value
Else
cmd.Parameters.AddWithValue("Photo", Photo)
End If