小弟最近在毕业设计遇到问题,就是我这有个员工信息表 只是个单表,很简单,里面有个photo字段 是 image类型。我用的是 C# VS2005我打算做成简历的形式,从DATESET中将 PHOTO 托到 空白 FORM中,然后再拖出 其他信息,系统自动生成 个 bingdingnavigator 自动完成 增删保存功能,现在我想在 上面加个按钮 "浏览"通过打开选择电脑上的其他图片格式的文件 将图片呈现到picturebox 中 然后在点bingdingnavigator中保存按钮自动向SQL中以2进制流的形式保存到 数据库中,前段时间也寻找了很久关于这个FileStream 的东西,自己也动手做了,但是能选择图片就是保存不成功,我也不知道哪里出了问题,希望高手能够用最简单的代码 帮我实现这个功能。
方法大概是把FileStream包装为MemoryStream,然后读为字节数组后,用Update语句更新进数据库的。通过DbParameter这种方式实现的。你先试一下,实在有疑问就给我留言。
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>");
}
//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对象
//所以利用byte[]来构建内存流对象
MemoryStream memoryStream = new MemoryStream(data);
//利用流对象构建Bitmap对象
Bitmap image = new System.Drawing.Bitmap(memoryStream);
正解:
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();注意红色字体,就是要显示为你存入的参数制定类型
{
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();
}
}
}
}
参考