Por que não consigo inserir DBNull.Value em um campo de imagem anulável no SQL Server 2005?
-
13-11-2019 - |
Pergunta
Por que não consigo inserir DBNull.Value
em um anulável image
-campo no SQL Server 2005?
Eu tentei 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();
item é do 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; }
}
Ao inserir recebo esta exceção:
Operand type clash: nvarchar is incompatible with image
Por que DBNull.Value
só tem problemas com image
?Por que não com datetime
?
Solução
Você poderia tentar isso:
command.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;
Outras dicas
Acho que isso pode ter a ver com o fato de você não estar definindo explicitamente o SqlParameter.SqlDbType e pensar que ele estará assumindo NVARCHAR.Em vez de usar AddWithValue, tente adicionar um novo SqlParameter e definir SqlDbType explicitamente como SqlDbType.Image.
Aqui está o Referência MSDN que indica que o padrão é NVARCHAR.
Você precisa especificar explicitamente o tipo do parâmetro como SqlDbType.Image
Eu resolvi isso assim:
If (Photo.Equals(DBNull.Value)) Then
cmd.Parameters.Add("Photo", SqlDbType.Image).Value = DBNull.Value
Else
cmd.Parameters.AddWithValue("Photo", Photo)
End If
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow