【问题标题】: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 clash: nvarchar is incompatible with image

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

【问题讨论】:

  • 存储过程呢,数据类型是什么?

标签: sql-server-2005 c#-2.0 nullable dbnull


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2011-04-22
      相关资源
      最近更新 更多