本帖最后由 hhsmelody 于 2013-03-14 15:11:58 编辑

解决方案 »

  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.   


    你是看传智播客的视频吧?我也遇到这样个情况,你现在解决了吗?实在找不到方法,只好判断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});因此以后不要偷懒了,还是每次都老老实实的指定数据类型吧。