为啥我不能将 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 ?使用 DBNull.Value 或 ToString().IsNullOrEmpty()