C#读取图片文件,然后将其保存到Sql Server 2012里的一张表里,该列的数据类型为Image。
然后再读取数据库,先用内存流保存该二进制图片,然后将内存流转换成位图显示。
转换成位图的时候总是显示“参数错误”。
选择图片 时测试过,可以用picturebox正常显示:
OpenFileDialog openDlg = new OpenFileDialog();
openDlg.Filter = "图片文件(*.jpg)|*.jpg";
string filePath = "";
if (openDlg.ShowDialog() == DialogResult.OK)
{
filePath = openDlg.FileName;
this.label_newcharacter_picture_filepath.Text = filePath;
/*-------打开文件流,用来读取图片文件中的数据------*/
FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
/*-------修改picturebox_newcharacter_picturedisplay对应的图片------*/
Bitmap bitmap1 = new Bitmap(stream);
pictureBox_newcharacter_picturedisplay.Image = bitmap1;
/*-------将文件流中的数据存储到内存字节组picturebuffer中------*/
picturebuffer = new byte[stream.Length];
stream.Read(picturebuffer, 0, (int)stream.Length);
stream.Close();
}
此处picturebox可以正常显示图片,并且用picturebuffer存储了图片的内容。
存储图片
SqlCommand cmd = new SqlCommand("StoredProcedure", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@chno", SqlDbType.Char).Value = textBox_newcharacter_chno.Text;
cmd.Parameters.Add("@career", SqlDbType.Char).Value = textBox_newcharacter_career.Text;
cmd.Parameters.Add("@skill", SqlDbType.VarChar).Value = textBox_newcharacter_skill.Text;
cmd.Parameters.Add("@picture", SqlDbType.Image).Value = picturebuffer;
cmd.ExecuteNonQuery();
MessageBox.Show("新建成功!");
也能正常存储,并且打开数据库也能看到<二进制数据>字样。
再 读取数据
con.Open();
string CharacterInfoSelect = "select * from character where chno = '" + CharacterNum + "'";
SqlDataAdapter CharacterAdapter = new SqlDataAdapter(CharacterInfoSelect, con);
DataTable CharacterTabel = new DataTable();
CharacterAdapter.Fill(CharacterTabel);
textBox_character_chno.Text = CharacterTabel.Rows[0][0].ToString();
textBox_character_career.Text = CharacterTabel.Rows[0][1].ToString();
textBox_character_skill.Text = CharacterTabel.Rows[0][2].ToString();
byte[] picturebuffer = (byte[])CharacterTabel.Rows[0][3];
MemoryStream stream1 = new MemoryStream(picturebuffer);
stream1.Write(picturebuffer, 0, picturebuffer.Length);
Image img = Image.FromStream(stream1);
pictureBox_character_picturedisplay.Image = img;
设断点调试,总是在执行 Image img = Image.FromStream(stream1); 时跳到catch。
试过别的办法:
string sql = "select picture from character where chno = '" + CharacterNum + "'";
SqlCommand cmm = new SqlCommand(sql, con);
SqlDataReader reader = cmm.ExecuteReader();
reader.Read();
MemoryStream stream = new MemoryStream((byte[])reader[0]);
pictureBox_character_picturedisplay.Image = Image.FromStream(stream);
没用。
byte[] picturebuffer = (byte[])CharacterTabel.Rows[0][3];
MemoryStream stream1 = new MemoryStream(picturebuffer);
Bitmap bitmap1 = new Bitmap(picturebuffer);
pictureBox_character_picturedisplay.Image = bitmap1;
这是书上最原始的代码,也行不通。
我在想是不是存入Sql server的时候,用Image格式存储会导致某种改变还是啥。别的数据都是对的,唯独读不出图片,求解。