c#从数据库中读取图片出现参数无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#从数据库中读取图片出现参数无效相关的知识,希望对你有一定的参考价值。

从SQL Server2000中读取图片 int i = 1; byte[] mybyte = ((byte[])dr["picture"]); //创建内存流。 MemoryStream myStream = new MemoryStream(); //图片二进制,写入内存 foreach (byte a in mybyte) myStream.WriteByte(a); //以内存数据流,创建图片对象。 Image myImage = Image.FromStream(myStream); myStream.Close(); //图片框赋值,显示出该图片对象。 i++; 在Image myImage = Image.FromStream(myStream); 出现参数无效错误。但之前相同个的语句在有datagridview的地方用过N次了。都没出现过问题,都可以读取出来,请问datagridview是不是有什么机制啊

说明:
DataGridView
控件替换了
DataGrid
控件并添加了功能;但是也可选择保留
DataGrid
控件以备
向后兼容
和将来使用。有关更多信息,请参见
Windows
窗体
DataGridView
控件和
DataGrid
控件之间的区别。
使用DataGridView
控件,可以显示和编辑来自多种不同类型的数据源的表格数据。

数据绑定

DataGridView
控件非常简单和直观,在大多数情况下,只需设置
DataSource
属性即可。在绑定到包含多个列表或表的数据源时,只需将
DataMember
属性设置为指定要绑定的列表或表的字符串即可。
DataGridView
控件支持标准
Windows
窗体数据绑定模型,因此该控件将绑定到下表所述的类的实例:
任何实现
IList
接口的类,包括一维数组。任何实现
IListSource
接口的类,例如
DataTable

DataSet
类。任何实现
IBindingList
接口的类,例如
BindingList(Of
T)
类。任何实现
IBindingListView
接口的类,例如
BindingSource
类。
DataGridView
控件支持对这些接口所返回对象的公共属性的数据绑定,如果在返回的对象上实现
ICustomTypeDescriptor
接口,则还支持对该接口所返回的属性集合的数据绑定。
通常绑定到
BindingSource
组件,并将
BindingSource
组件绑定到其他数据源或使用
业务对象
填充该组件。BindingSource
组件为首选数据源,因为该组件可以绑定到各种数据源,并可以自动解决许多数据绑定问题。有关更多信息,请参见
BindingSource
组件。
DataGridView
控件还可以在“取消绑定”模式下使用,无需任何基础数据存储区。有关使用未绑定的
DataGridView
控件的代码示例,请参见演练:创建未绑定的
Windows
窗体
DataGridView
控件。
DataGridView
控件具有极高的可配置性和可扩展性,它提供有大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。当需要在
Windows
窗体应用程序中显示表格数据时,请首先考虑使用
DataGridView
控件,然后再考虑使用其他控件(例如
DataGrid)。若要以小型网格显示只读值,或者若要使用户能够编辑具有数百万条记录的表,DataGridView
控件将为您提供可以方便地进行编程以及有效地利用内存的解决方案。
参考技术A yte[]
im
=
(byte[])commond.executescalar();
memorystream
stream
=
new
memorystream(im,
false);
picturebox1.image
=
image.fromstream(stream);
//报错,参数无效????
stream.close();
con.close();
sqlcommand
commond
=
new
sqlcommand("select
personimage
from
temp",
con);
这里需要修改一下,你要判断你要找的是哪个图片?
修改为
using(memorystream
ms=new
memorystrem(im))

picturebox1.image
=
image.fromstream(stream);

C# 图片保存到数据库和从数据库读取图片并显示

图片保存到数据库的方法:

        public void imgToDB(string sql)
        {   //参数sql中要求保存的imge变量名称为@images
            //调用方法如:imgToDB("update UserPhoto set [email protected] where UserNo=‘" + temp + "‘");
            FileStream fs = File.OpenRead(t_photo.Text);
            byte[] imageb = new byte[fs.Length];
            fs.Read(imageb, 0, imageb.Length);
            fs.Close();
            SqlCommand com3 = new SqlCommand (sql,con);
            com3.Parameters.Add("@images", SqlDbType.Image).Value = imageb;
            if (com3.Connection.State == ConnectionState.Closed)
                com3.Connection.Open();
            try
            {
                com3.ExecuteNonQuery();
            }
            catch
            { }
            finally
            { com3.Connection.Close(); }
        }

数据库中读出图片并显示在picturebox中:

方法一:
private void ShowImage(string sql)
     {
     //调用方法如:ShowImage("select Photo from UserPhoto where UserNo=‘" + userno +"‘");
     SqlCommand cmd = new SqlCommand(sql, conn);
     conn.Open();
     byte[] b= (byte[])cmd.ExecuteScalar();
     if (b.Length 〉 0)
     {
     MemoryStream stream = new MemoryStream(b, true);
     stream.Write(b, 0, b.Length);
      pictureBox1.Image = new Bitmap(stream);
      stream.Close();
     }
     conn.Close();
     }

方法二:当在dg中选中某行时:
private void dg_MouseUp(object sender, MouseEventArgs e)
        {
            //整行选择
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {//用户编号,姓名,性别,身份证号,籍贯,学院,系所,校区,部门,电话,照片
                  //显示相片
                object imgobj=dg[10, dg.CurrentRow.Index].Value;
                if (imgobj != null && !Convert.IsDBNull(imgobj))
                {
                    byte[] imgb = (byte[])imgobj;
                    MemoryStream memStream = new MemoryStream(imgb);
                    try
                    {
                        Bitmap myimge = new Bitmap(memStream);
                        this.pictureBox1.Image = myimge;
                    }
                    catch
                    {
                        DB.msgbox("从数据库读取相片失败!");
                    }
                }
                else
                    pictureBox1.Image = null;
            }

 

使用C#进行图片的数据库存取 
 
 

 

本文总结如何在.Net WinForm和.Net WebForm(asp.net)中将图片存入SQL Server中并读取显示的方法 。 
1.使用asp.net将图片上传并存入SQL Server中,然后从SQL Server中读取并显示出来: 
1)上传并存入SQL Server

数据库结构 
create table test 

id identity(1,1), 
FImage image 

相关的存储过程 
Create proc UpdateImage 

@UpdateImage Image 

As 
Insert Into test(FImage) values(@UpdateImage) 
GO 
在UpPhoto.aspx文件中添加如下: 
<input id="UpPhoto" name="UpPhoto" runat="server" type="file"> 
<asp:Button id="btnAdd" name="btnAdd" runat="server" Text="上传"></asp:Button> 
然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码: 
private void btnAdd_Click(object sender, System.EventArgs e) 

//获得图象并把图象转换为byte[] 
HttpPostedFile upPhoto=UpPhoto.PostedFile; 
int upPhotoLength=upPhoto.ContentLength; 
byte[] PhotoArray=new Byte[upPhotoLength]; 
Stream PhotoStream=upPhoto.InputStream; 
PhotoStream.Read(PhotoArray,0,upPhotoLength); 
//连接数据库 
SqlConnection conn=new SqlConnection(); 
conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa"; 
SqlCommand cmd=new SqlCommand("UpdateImage",conn); 
cmd.CommandType=CommandType.StoredProcedure; 
cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); 
cmd.Parameters["@UpdateImage"].Value=PhotoArray; 
//如果你希望不使用存储过程来添加图片把上面四句代码改为: 
//string strSql="Insert into test(FImage) values(@FImage)"; 
//SqlCommand cmd=new SqlCommand(strSql,conn); 
//cmd.Parameters.Add("@FImage",SqlDbType.Image); 
//cmd.Parameters["@FImage"].Value=PhotoArray; 
conn.Open(); 
cmd.ExecuteNonQuery(); 
conn.Close(); 

2)从SQL Server中读取并显示出来 
在需要显示图片的地方添加如下代码: 
<asp:image id="imgPhoto" runat="server" ImageUrl="ShowPhoto.aspx"></asp:image> 
ShowPhoto.aspx主体代码: 
private void Page_Load(object sender, System.EventArgs e) 

if(!Page.IsPostBack) 

SqlConnection conn=new SqlConnection() 
conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa"; 
string strSql="select * from test where id=2";//这里假设获取id为2的图片 
SqlCommand cmd=new SqlCommand(strSql,conn); 
conn.Open(); 
SqlDataReader reader=cmd.ExecuteReader(); 
reader.Read(); 
Response.ContentType="application/octet-stream"; 
Response.BinaryWrite((Byte[])reader["FImage"]); 
Response.End(); 
reader.Close(); 

}

2.在WinForm中将图片存入SQL Server,并从SQL Server中读取并显示在picturebox中 
1),存入SQL Server 
数据库结构和使用的存储过过程,同上面的一样 
首先,在窗体中加一个OpenFileDialog控件,命名为ofdSelectPic ; 
然后,在窗体上添加一个打开文件按钮,添加如下单击事件代码: 
Stream ms; 
byte[] picbyte; 
//ofdSelectPic.ShowDialog(); 
if (ofdSelectPic.ShowDialog()==DialogResult.OK) 

if ((ms=ofdSelectPic.OpenFile())!=null) 

//MessageBox.Show("ok"); 
picbyte=new byte[ms.Length]; 
ms.Position=0; 
ms.Read(picbyte,0,Convert.ToInt32(ms.Length)); 
//MessageBox.Show("读取完毕!"); 
//连接数据库 
SqlConnection conn=new SqlConnection(); 
conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa"; 
SqlCommand cmd=new SqlCommand("UpdateImage",conn); 
cmd.CommandType=CommandType.StoredProcedure; 
cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); 
cmd.Parameters["@UpdateImage"].Value=picbyte; 
conn.Open(); 
cmd.ExecuteNonQuery(); 
conn.Close(); 
ms.Close(); 


2)读取并显示在picturebox中 
首先,添加一个picturebox,名为ptbShow 
然后,添加一个按钮,添加如下响应事件: 
SqlConnection conn=new SqlConnection(); 
conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa"; 
string strSql="select FImage from test where id=1"; 
SqlCommand cmd=new SqlCommand(strSql,conn); 
conn.Open(); 
SqlDataReader reader=cmd.ExecuteReader(); 
reader.Read(); 
MemoryStream ms=new MemoryStream((byte[])reader["FImage"]);

Image image=Image.FromStream(ms,true); 
reader.Close(); 
conn.Close(); 
ptbShow.Image=image;

以上是关于c#从数据库中读取图片出现参数无效的主要内容,如果未能解决你的问题,请参考以下文章

C# 图片保存到数据库和从数据库读取图片并显示

参数对于通过 blob 从数据库访问图像无效

C# Image image = Image.FromStream()报错参数无效

C#中,已知图片内存的首地址(System.IntPtr类),想通过pictureBox显示于窗口,但提示“参数无效”

c# 从数据库中读取图片数据流,然后转换成图片显示到网页上?

图片保存到数据库以及C#读取图片