Почему я не могу вставить DBNull.Value в обнуляемое поле изображения в SQL Server 2005? - PullRequest
2 голосов
/ 24 января 2012

Почему я не могу вставить DBNull.Value в пустое поле image в sql server 2005?

Я попробовал этот код:

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();

элемент относится к типу 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; }
}

При вставке я получаю следующее исключение:

Operand type clash: nvarchar is incompatible with image

Почему DBNull.Value имеет проблемы только с image?Почему не с datetime?

Ответы [ 4 ]

4 голосов
/ 20 июня 2012

Вы можете попробовать это:

command.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;
1 голос
/ 24 января 2012

Вам необходимо явно указать тип параметра как SqlDbType.Image

1 голос
/ 24 января 2012

Я думаю, что это может быть связано с тем, что вы не определяете явным образом SqlParameter.SqlDbType и думаете, что это будет предполагать NVARCHAR.Вместо использования AddWithValue, попробуйте добавить новый SqlParameter и явно задать SqlDbType для SqlDbType.Image.

Вот MSDN ref , в котором указано, что по умолчанию используется NVARCHAR.

0 голосов
/ 09 мая 2015

Я решил это так:

If (Photo.Equals(DBNull.Value)) Then
    cmd.Parameters.Add("Photo", SqlDbType.Image).Value = DBNull.Value
Else
    cmd.Parameters.AddWithValue("Photo", Photo)
End If
...