2 lan mmm lan_mmm 于 2014.11.10 17:58 提问

C#保存图片到sql server2012的image格式,再读取出来的时候总是说“参数错误”

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格式存储会导致某种改变还是啥。别的数据都是对的,唯独读不出图片,求解。

3个回答

save4me
save4me   Ds   Rxr 2014.12.18 10:59

上面的答案有帮助吗?如果还有问题,请提出来,如果对答案满意,请顶一下,并标记为采纳答案,谢谢!

caihh1995
caihh1995 我不知道他有没有成功,不过我的成功了,困扰了我大半天,原来是保存二进制数据的时候方式错了,谢谢了
接近 3 年之前 回复
save4me
save4me   Ds   Rxr 2014.11.19 11:13

参考MSDN 从文件插入图像 (ADO.NET)

cmd.Parameters.Add("@picture", SqlDbType.Image).Value = picturebuffer;

cmd.Parameters.Add("@picture", SqlDbType.Image, picturebuffer.Length).Value = picturebuffer;
看看这样能不能解决问题

guwei4037
guwei4037   Ds   Rxr 2015.11.18 09:18

“参数错误” 有两种可能:
1、保存的时候图片就是错误的,比如不完整。读取的时候自然出错。
2、保存的时候是正确的,但是读取的时候出错了。

所以你得排查一下,Image字段类型是正确的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!