SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

时间:2022-04-16 13:23:57
SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??
Employee()为Model,即Photo为表Employee中的一个字段
byte[] photo{get;set;}
Employee emp=new Employee();
if(photo==null)
{
return DBNull.Value;
}
else
{
return photo;
}
emp.Photo=photo;
ExecuteNonQuery("insert into Employee(Photo) values(@Photo)",new SqlParameter("@Photo",emp.Photo));
当执行插入语句,emp.Photo的值为DBNull.Value时提示:操作数类型冲突: nvarchar 与 image 不兼容;
emp.Photo的值不为空时,成功,求解?????????
数据库中Photo所对应字段为Image类型,C#中定义photo为byte[];

14 个解决方案

#1



SqlParameter param=new SqlParameter("@Photo")", emp.Photo==DBNull.Value ?  null:emp.Photo);
param.SqlDbType = SqlDbType.Image;

ExecuteNonQuery("insert into Employee(Photo) values(@Photo)",param);

#2


运算符“==”无法应用于“byte[]”和“System.DBNull”类型的操作数

#3


而且SqlParameter("@Photo",DBNull.value)中DBNull.value不能用null来替换,否则会出错找不到@Photo对应参数

#4


photo为byte[] 为null的时候,photo= new byte[0]

这样的话,往数据库保存的时候,就不会有异常

#5


是的,我在sql2008中直接用插入语句,插入null可以;在vs2010中不用SqlParameter而是在insert中直接使用‘“+DBNull.Value+"'也行,但不是插入的null而是<二进制数>数据库字段中显示,就是用了SqlParameter后,不知道怎么插入null

#6


SqlParameter("@Photo",SqlDbType.Image);什么都不要写就是null

#7


引用 5 楼 hhsmelody 的回复:
是的,我在sql2008中直接用插入语句,插入null可以;在vs2010中不用SqlParameter而是在insert中直接使用‘“+DBNull.Value+"'也行,但不是插入的null而是<二进制数>数据库字段中显示,就是用了SqlParameter后,不知道怎么插入null


你是看传智播客的视频吧?我也遇到这样个情况,你现在解决了吗?

实在找不到方法,只好判断Image不能为null。

#8


有学生在看传智播客的免费“.Net人事管理系统开发”视频教程(http://net.itcast.cn/subject/rsgl/index.html )的时候遇到下面的问题:
ExecuteNonQuery("insert into Employee(Photo) values(@Photo)",new SqlParameter("@Photo",emp.Photo));
当执行插入语句,emp.Photo的值为DBNull.Value时提示:操作数类型冲突: nvarchar 与 image 不兼容;

这其实是没有指定DbType的原因。大部分情况下,使用SqlParameter的时候不需要指定参数的数据类型(DbType或者SqlDbType),ADO.Net会根据value的类型来自动判断出数据类型,即使ADO.Net不能判断出来,SQLServer数据库服务器也能进行大部分的判断(当然会损失一些性能)。
但是对于这个程序中的Image类型就没那么幸运了,如果不指定DbType,而恰好数据又为Null/DbNull的时候,ado.net就把数据类型识别成为了nvarchar,就出现了上面的错误了。因此只要指定DbType或者SqlDbType即可。下面的代码成功运行:
            SqlHelper.ExecuteNonQuery("insert into T_Persons(Name,Photo) values(@Name,@Photo)", new SqlParameter("@Name", "itcast"),
                new SqlParameter("@Photo", SqlDbType.Image) { Value=DBNull.Value});

因此以后不要偷懒了,还是每次都老老实实的指定数据类型吧。

#9


杨老师正解! SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

#10


杨老师V5!

#11


确实 SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

#12


老杨正解,帮了我大忙!VVVV55555555555

#13


居然能百度到老杨的回复,激动了一下!哈哈~还真是这个问题呀~
看来老杨要更新一下你的视频教程啦!

#14


在看杨老师的视频,看到拍照的那个视频,被杨老师的发型彻底惊呆了 SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

#1



SqlParameter param=new SqlParameter("@Photo")", emp.Photo==DBNull.Value ?  null:emp.Photo);
param.SqlDbType = SqlDbType.Image;

ExecuteNonQuery("insert into Employee(Photo) values(@Photo)",param);

#2


运算符“==”无法应用于“byte[]”和“System.DBNull”类型的操作数

#3


而且SqlParameter("@Photo",DBNull.value)中DBNull.value不能用null来替换,否则会出错找不到@Photo对应参数

#4


photo为byte[] 为null的时候,photo= new byte[0]

这样的话,往数据库保存的时候,就不会有异常

#5


是的,我在sql2008中直接用插入语句,插入null可以;在vs2010中不用SqlParameter而是在insert中直接使用‘“+DBNull.Value+"'也行,但不是插入的null而是<二进制数>数据库字段中显示,就是用了SqlParameter后,不知道怎么插入null

#6


SqlParameter("@Photo",SqlDbType.Image);什么都不要写就是null

#7


引用 5 楼 hhsmelody 的回复:
是的,我在sql2008中直接用插入语句,插入null可以;在vs2010中不用SqlParameter而是在insert中直接使用‘“+DBNull.Value+"'也行,但不是插入的null而是<二进制数>数据库字段中显示,就是用了SqlParameter后,不知道怎么插入null


你是看传智播客的视频吧?我也遇到这样个情况,你现在解决了吗?

实在找不到方法,只好判断Image不能为null。

#8


有学生在看传智播客的免费“.Net人事管理系统开发”视频教程(http://net.itcast.cn/subject/rsgl/index.html )的时候遇到下面的问题:
ExecuteNonQuery("insert into Employee(Photo) values(@Photo)",new SqlParameter("@Photo",emp.Photo));
当执行插入语句,emp.Photo的值为DBNull.Value时提示:操作数类型冲突: nvarchar 与 image 不兼容;

这其实是没有指定DbType的原因。大部分情况下,使用SqlParameter的时候不需要指定参数的数据类型(DbType或者SqlDbType),ADO.Net会根据value的类型来自动判断出数据类型,即使ADO.Net不能判断出来,SQLServer数据库服务器也能进行大部分的判断(当然会损失一些性能)。
但是对于这个程序中的Image类型就没那么幸运了,如果不指定DbType,而恰好数据又为Null/DbNull的时候,ado.net就把数据类型识别成为了nvarchar,就出现了上面的错误了。因此只要指定DbType或者SqlDbType即可。下面的代码成功运行:
            SqlHelper.ExecuteNonQuery("insert into T_Persons(Name,Photo) values(@Name,@Photo)", new SqlParameter("@Name", "itcast"),
                new SqlParameter("@Photo", SqlDbType.Image) { Value=DBNull.Value});

因此以后不要偷懒了,还是每次都老老实实的指定数据类型吧。

#9


杨老师正解! SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

#10


杨老师V5!

#11


确实 SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??

#12


老杨正解,帮了我大忙!VVVV55555555555

#13


居然能百度到老杨的回复,激动了一下!哈哈~还真是这个问题呀~
看来老杨要更新一下你的视频教程啦!

#14


在看杨老师的视频,看到拍照的那个视频,被杨老师的发型彻底惊呆了 SqlParameter("@Photo",DBNull.Value)存储到数据库Image提示nvarchar与image数据类型不匹配??