小弟最近在毕业设计遇到问题,就是我这有个员工信息表 只是个单表,很简单,里面有个photo字段 是 image类型。我用的是 C#    VS2005我打算做成简历的形式,从DATESET中将   PHOTO 托到  空白  FORM中,然后再拖出  其他信息,系统自动生成 个  bingdingnavigator   自动完成  增删保存功能,现在我想在 上面加个按钮 "浏览"通过打开选择电脑上的其他图片格式的文件  将图片呈现到picturebox 中 然后在点bingdingnavigator中保存按钮自动向SQL中以2进制流的形式保存到 数据库中,前段时间也寻找了很久关于这个FileStream 的东西,自己也动手做了,但是能选择图片就是保存不成功,我也不知道哪里出了问题,希望高手能够用最简单的代码 帮我实现这个功能。

解决方案 »

  1.   

    我一般不会用bingdingnavigator这种自动完成的方式,也不是说不好,主要是没研究过,用不明白。呵呵。我以前做过一个类似你说我这样的东东。
    方法大概是把FileStream包装为MemoryStream,然后读为字节数组后,用Update语句更新进数据库的。通过DbParameter这种方式实现的。你先试一下,实在有疑问就给我留言。
      

  2.   

    如果在表中使用到二进制数据就很难直接向表中插入或更新数据了,这就需要使用参数化的SQL语句或者存储过程了。在前面创建的FileList表中就使用了Image字段来存储上传图片的数据,因此操作表时会使用参数化的SQL语句。
      

  3.   


    string sql = "insert into FileList(FileName,FileData,FileLength,Mime)values(@FileName,@FileData,@FileLength,@Mime)";
                    SqlParameter[] parameters = new SqlParameter[4];
                    parameters[0] = new SqlParameter("@FileName", SqlDbType.NVarChar, 50);
                    parameters[0].Value = fileName;                parameters[1] = new SqlParameter("@FileData", SqlDbType.Image, int.MaxValue);
                    parameters[1].Value = data;                parameters[2] = new SqlParameter("@FileLength", SqlDbType.Int, 4);
                    parameters[2].Value = contentLength;                parameters[3] = new SqlParameter("@Mime", SqlDbType.VarChar, 50);
                    parameters[3].Value = mime;                SqlDbHelper helper = new SqlDbHelper(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString);
                    if (helper.ExecuteNonQuery(sql, CommandType.Text, parameters) > 0)
                    {
                        Response.Write("<script language='javascript'>alert('上传成功!');</script>");
                    }
      

  4.   

    你不要用filestream 去保存,直接用update方法。navigator很好用,用它给你现成的方法。
      

  5.   

    读取图片数据构造图片类string sql = "select Mime,FileData from FileList where FileID=@FileID";
                //SqlDbHelper是我们自己编写的数据库通用类
                SqlDbHelper helper = new SqlDbHelper(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString);
                SqlParameter[] parameters = new SqlParameter[1];
                parameters[0] = new SqlParameter("@FileID", SqlDbType.Int, 4);
                parameters[0].Value = fileId;
                SqlDataReader reader = helper.ExecuteReader(sql,CommandType.Text,parameters);
                byte[] data = null;
                string mime = string.Empty;
                //如果存在图片记录,所以按编号查询最多只有一条记录
                //这里就用if判断而不用while循环
                if (reader.Read())
                {
                    //将数据库中的image字段保存的数据转换成byte[]
                    data = (byte[])(reader["FileData"]);
                    mime = (string)(reader["mime"]);
                }
                reader.Close();//读取数据之后及时关闭Reader对象
                
      

  6.   

    //因为不存在直接将byte[]转换成图象的方法
                    //所以利用byte[]来构建内存流对象
                    MemoryStream memoryStream = new MemoryStream(data);
                    //利用流对象构建Bitmap对象
                    Bitmap image = new System.Drawing.Bitmap(memoryStream);
      

  7.   


    正解:
    Image对象以二进制形式存入到SQL是必须制定参数类型的如:byte[] img; //存放图片的数组,可由Stream中获取存入数据库:SqlCommand cmd = new SqlCommand("insert into Table1 values(@imgBinary)", conn);cmd.Parameters.Add("@imgBinary",SqlDbType.Image);
    cmd.Parameters["@imgBinary"].value = img;cmd.ExcuteNonQuery();注意红色字体,就是要显示为你存入的参数制定类型
      

  8.   

    private void AddStudentPhoto(int Student_ID, string ImageFile) 

    FileStream myFile = new FileStream(ImageFile, FileMode.Open, FileAccess.Read); 
    byte[] Photo = new byte[myFile.Length]; 
    myFile.Read(Photo, 0, (int)myFile.Length); 
    myFile.Close(); 
    SavePhotoToDB(Student_ID, Photo); 

    private void SavePhotoToDB(int Student_ID, byte[] Photo) 

    string ConnectString = "";using (SqlConnection myCon = new SqlConnection(ConnectString) ) 

    if (myCon.State != ConnectionState.Open) 
    myCon.Open(); 
    SqlCommand myCmd = new SqlCommand("", myCon); 
    myCmd.CommandType = CommandType.StoredProcedure; 
    myCmd.Parameters.Add(new SqlParameter("@Student_ID", SqlDbType.Int, 0)); 
    myCmd.Parameters.Add(new SqlParameter("@Photo", SqlDbType.Image)); 
    myCmd.Parameters["@Student_ID"].Value = Student_ID; 
    myCmd.Parameters["@Photo"].Value = Photo; 
    myCmd.ExecuteNonQuery(); 
    myCon.Close(); 




    参考