hoestelan 2014-11-10 09:58 采纳率: 0%
浏览 3960

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 2014-11-19 03:13
    关注

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

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

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

    评论

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择