为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?

Posted

技术标签:

【中文标题】为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?【英文标题】:Why can't I insert DBNull.Value into a nullable image-field in sql server 2005?为什么我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中? 【发布时间】:2012-01-24 10:39:37 【问题描述】:

为什么我不能在 sql server 2005 中将 DBNull.Value 插入到可为空的 image 字段中?

我试过这段代码:

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 ***: nvarchar is incompatible with image

为什么DBNull.Value 只有image 有问题?为什么不用datetime

【问题讨论】:

存储过程呢,数据类型是什么? 【参考方案1】:

你可以试试这个:

command.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;

【讨论】:

【参考方案2】:

我认为这可能与您没有明确定义 SqlParameter.SqlDbType 并认为它将假定为 NVARCHAR 的事实有关。尝试添加新的 SqlParameter 并将 SqlDbType 显式设置为 SqlDbType.Image,而不是使用 AddWithValue。

这是MSDN ref,它声明默认值为 NVARCHAR。

【讨论】:

是的。但是我已经发布了我的代码,你可以看到 DateTime 工作正常。 A NULL NVARCHAR 可以毫无问题地转换为 DATETIME。但是,当您收到转换错误时,无法将 NULL NVARCHAR 转换为 IMAGE。试一试,将该参数的 SqlDbType 设置为 Image。【参考方案3】:

您需要将参数的类型显式指定为 SqlDbType.Image

【讨论】:

是的。但是我已经发布了我的代码,你可以看到 DateTime 工作正常。 是的,那是因为存在 nvarchar 到 datetime 之间的隐式转换,并且它应该处理 NULL 值。并且没有任何从 nvarchar 到 Image 的隐式转换,即使 value 为 NULL 转换是否与SqlServer2005或SqlCommand对象关联?【参考方案4】:

我是这样解决的:

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

【讨论】:

以上是关于为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 collasce null 运算符与 DbNull.Value 一起使用?

DBNull和Null的区别

将DBNull传递给SqlParameter时出错

我应该用啥来比较 DBNull ?使用 DBNull.Value 或 ToString().IsNullOrEmpty()

使用三元语法将参数设置为 DBNull.Value 会出错?

为啥我不能将这些值插入到我添加到此数据库的表中?