ASP.NET存取SQL Server数据库图片

转载 2004年07月01日 09:29:00

ASP.NET存取SQL Server数据库图片


作者:wyhw  发表时间:2003-5-11   推荐程度:   查看作者信息以及作者文集

SQL Server提供了一个特别的数据类型:image,它是一个包含binary数据的类型。下边这个例子就向你展示了如何将文本或照片放入到数据库中的办法。在这篇文章中我们要看到如何在SQL Server中存储和读取图片。

1、建立一个表:
在SQL SERVER中建立这样结构的一个表:
列名 类型 目的
ID Integer 主键ID
IMGTITLE Varchar(50) 图片的标题
IMGTYPE Varchar(50) 图片类型. ASP.NET要以辨认的类型
IMGDATA Image 用于存储二进制数据

2、存储图片到SQL SERVER数据库中

为了能存储到表中,你首先要上传它们到你的WEB 服务器上,你可以开发一个web form,它用来将客户端中TextBox web control中的图片入到你的WEB服务器上来。将你的 encType 属性设置为:myltipart/formdata.

Stream imgdatastream = File1.PostedFile.InputStream;
int imgdatalen = File1.PostedFile.ContentLength;
string imgtype = File1.PostedFile.ContentType;
string imgtitle = TextBox1.Text;
byte[] imgdata = new byte[imgdatalen];
int n = imgdatastream.Read(imgdata,0,imgdatalen);
string connstr=((NameValueCollection)Context.GetConfig("appSettings"))["connstr"];

SqlConnection connection = new SqlConnection(connstr);

SqlCommand command = new SqlCommand
         ("INSERT INTO ImageStore(imgtitle,imgtype,imgdata)
         VALUES ( @imgtitle, @imgtype,@imgdata )", connection );

SqlParameter paramTitle = new SqlParameter
         ("@imgtitle", SqlDbType.VarChar,50 );

paramTitle.Value = imgtitle;
command.Parameters.Add( paramTitle);

SqlParameter paramData = new SqlParameter( "@imgdata", SqlDbType.Image );
paramData.Value = imgdata;
command.Parameters.Add( paramData );

SqlParameter paramType = new SqlParameter( "@imgtype", SqlDbType.VarChar,50 );
paramType.Value = imgtype;
command.Parameters.Add( paramType );

connection.Open();
int numRowsAffected = command.ExecuteNonQuery();
connection.Close();

3、从数据库中恢复读取

现在让我们来从SQL Server中读取我们放入的数据吧!我们将要输出图片到你的浏览器上,你也可以将它存放到你要的位置。

private void Page_Load(object sender, System.EventArgs e)
{
 string imgid =Request.QueryString["imgid"];
 string connstr=((NameValueCollection)
 Context.GetConfig("appSettings"))["connstr"];
 string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = " + imgid;
 SqlConnection connection = new SqlConnection(connstr);
 SqlCommand command = new SqlCommand(sql, connection);
 connection.Open();
 SqlDataReader dr = command.ExecuteReader();
 if(dr.Read())
 {
  Response.ContentType = dr["imgtype"].ToString();
  Response.BinaryWrite( (byte[]) dr["imgdata"] );
 }
 connection.Close();
}

要注意的是Response.BinaryWrite 而不是Response.Write.

下面给大家一个用于C# Winform的存入、读取程序。其中不同请大家自己比较!(为了方便起见,我将数据库字段简化为二个:imgtitle和imgdata。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Data.SqlClient;

namespace WindowsApplication21
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button button1;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
  private string ConnectionString = "Integrated Security=SSPI;Initial Catalog=;Data Source=localhost;";
  private SqlConnection conn = null;
  private SqlCommand cmd = null;
  private System.Windows.Forms.Button button2;
  private System.Windows.Forms.PictureBox pic1;
  private System.Windows.Forms.OpenFileDialog openFileDialog1;
  private string sql = null;
  private System.Windows.Forms.Label label2;
  private string nowId=null;

 public Form1()
 {
  //
  // Windows 窗体设计器支持所必需的
  //
  InitializeComponent();
  conn = new SqlConnection(ConnectionString);

  //
  // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  //
 }

 /// <summary>
 /// 清理所有正在使用的资源。
 /// </summary>
 protected override void Dispose( bool disposing )
 {
  if (conn.State == ConnectionState.Open)
   conn.Close();
  if( disposing )
  {
   if (components != null)
   {
    components.Dispose();
   }
  }
  base.Dispose( disposing );

 }

 #region Windows Form Designer generated code
 /// <summary>
 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
 /// 此方法的内容。
 /// </summary>
 private void InitializeComponent()
 {
  this.button1 = new System.Windows.Forms.Button();
  this.pic1 = new System.Windows.Forms.PictureBox();
  this.button2 = new System.Windows.Forms.Button();
  this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
  this.label2 = new System.Windows.Forms.Label();
  this.SuspendLayout();
  //
  // button1
  //
  this.button1.Location = new System.Drawing.Point(0, 40);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(264, 48);
  this.button1.TabIndex = 0;
  this.button1.Text = "加入新的图片";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // pic1
  //
  this.pic1.Location = new System.Drawing.Point(280, 8);
  this.pic1.Name = "pic1";
  this.pic1.Size = new System.Drawing.Size(344, 264);
  this.pic1.TabIndex = 3;
  this.pic1.TabStop = false;
  //
  // button2
  //
  this.button2.Location = new System.Drawing.Point(0, 104);
  this.button2.Name = "button2";
  this.button2.Size = new System.Drawing.Size(264, 40);
  this.button2.TabIndex = 4;
  this.button2.Text = "从数据库中恢复图像";
  this.button2.Click += new System.EventHandler(this.button2_Click);
  //
  // openFileDialog1
  //
  this.openFileDialog1.Filter = "/"图像文件(*.jpg,*.bmp,*.gif)|*.jpg|*.bmp|*.gif/"";
  //
  // label2
  //
  this.label2.Location = new System.Drawing.Point(0, 152);
  this.label2.Name = "label2";
  this.label2.Size = new System.Drawing.Size(264, 48);
  this.label2.TabIndex = 5;
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(632, 273);
  this.Controls.AddRange(new System.Windows.Forms.Control[] {
    this.label2,
    this.button2,
    this.pic1,
    this.button1});
  this.Name = "Form1";
  this.Text = "Form1";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.ResumeLayout(false);

 }
 #endregion
 
 /// <summary>
 /// 应用程序的主入口点。
 /// </summary>
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }

 private void button1_Click(object sender, System.EventArgs e)
 {
  openFileDialog1.ShowDialog ();
  
  if (openFileDialog1.FileName.Trim()!="")
  {
   FileInfo fi = new FileInfo(openFileDialog1.FileName);

   string imgtitle=openFileDialog1.FileName;
   int imgdatalen=(int)fi.Length;
   byte[] imgdata = new byte[imgdatalen];
  
   Stream imgdatastream=fi.OpenRead();
   int n=imgdatastream.Read(imgdata,0,imgdatalen);


   if( conn.State == ConnectionState.Open)
    conn.Close();
   ConnectionString ="Integrated Security=SSPI;" + "Initial Catalog=mydb;" +"Data  Source=localhost;";
   conn.ConnectionString = ConnectionString;


 try
 {
  string mySelectQuery = "INSERT INTO ImageStore(imgtitle,imgdata) VALUES (@imgtitle, @imgdata )";
  //string mySelectQuery="UPDATE ImageStore set imgtitle=@imgtitle,imgdata=@imgdata" ;
  SqlCommand myCommand = new SqlCommand(mySelectQuery, conn);

  SqlParameter paramTitle = new SqlParameter("@imgtitle", SqlDbType.VarChar,50 );
  paramTitle.Value = imgtitle;
  myCommand.Parameters.Add( paramTitle);

  SqlParameter paramData = new SqlParameter( "@imgdata", SqlDbType.Image );
  paramData.Value = imgdata;
  myCommand.Parameters.Add( paramData );

  conn.Open();
  int numRowsAffected = myCommand.ExecuteNonQuery();
  conn.Close();
 }
 catch(Exception err)
 {
  MessageBox.Show("您输入名称可能在数据库中已存在或输入为空,请检查!"+err.ToString() );
 }
 finally
 {}
}

}

 private void Form1_Load(object sender, System.EventArgs e)
 {
 }

 private void button2_Click(object sender, System.EventArgs e)
 {
  //打开数据库连接
  if( conn.State == ConnectionState.Open)
   conn.Close();
  ConnectionString ="Integrated Security=SSPI;" + "Initial Catalog=mydb;" +"Data Source=localhost;";
  conn.ConnectionString = ConnectionString;

  // 创建数据适配器
  string sql="SELECT * FROM ImageStore" ;
  SqlCommand command = new SqlCommand(sql, conn);
 
  try
  {conn.Open();}
  catch(Exception newerr)
  {
   MessageBox.Show(" 不能打开数据联接!") ;
  }
  finally
  {}

  SqlDataReader dr = command.ExecuteReader();
  if(dr.Read())
  {
   FileInfo fi = new FileInfo("temp");
   FileStream myStream=fi.Open(FileMode.Create);
   byte[] mydata=((byte[])dr["imgdata"]);
   //label2.Text="您现在看到的是:"+ dr["imgtitle"].ToString();
   foreach(byte a in mydata)
   {
    myStream.WriteByte(a);
   }
  myStream.Close();
  Image myImage=Image.FromFile("temp") ;
  pic1.Image=myImage;
  pic1.Refresh();
  dr.Close ();

 }
 else
 {
  MessageBox.Show("没有成功读入数据!") ;
 }
 conn.Close();
}
}
}

VC在Sql Server数据库中如何存取二进制图片信息

转载地址:VC在Sql Server数据库中如何存取二进制图片信息  http://blog.hehehehehe.cn/a/1396.htm 在VC6.0中我们通常用Ado的Field 对象的Ge...
  • lijun5635
  • lijun5635
  • 2016年06月23日 09:13
  • 1092

asp.net学习总结——ADO.net(对Sql Server进行操作的数据访问类)

ADO.net(对Sql Server进行操作的数据访问类)
  • sun15732621550
  • sun15732621550
  • 2016年06月11日 21:40
  • 1041

ASP.Net数据库如何存取图片

当我们有大量的图片或者图片比较大时,我们常规的做法可能是保存图片路径,但是也不排除需要将图片直接存放到数据库的情况,此时就需要保存图片到数据库了。这篇文章我会向大家介绍: 如何通过FileUpL...
  • dapangzi88
  • dapangzi88
  • 2017年01月29日 17:08
  • 1872

ASP.Net数据库如何存取图片

当我们有大量的图片或者图片比较大时,我们常规的做法可能是保存图片路径,但是也不排除需要将图片直接存放到数据库的情况,此时就需要保存图片到数据库了。这篇文章我会向大家介绍: 如何通过FileUpL...
  • ooim802
  • ooim802
  • 2017年01月31日 21:33
  • 140

ASP.Net数据库如何存取图片

当我们有大量的图片或者图片比较大时,我们常规的做法可能是保存图片路径,但是也不排除需要将图片直接存放到数据库的情况,此时就需要保存图片到数据库了。这篇文章我会向大家介绍: 如何通过FileUpL...
  • thx9537
  • thx9537
  • 2017年01月30日 19:43
  • 184

C++使用ADO存取图片

 在项目中,我们需要把事故简图上传到总服务器,以便每个客户端都能下载或者查看。在网上找了找,向Server2000存储图片代码比较多,从数据库中读取图片并显示也不少,但是把图片从数据库中二进制数...
  • eit520
  • eit520
  • 2014年06月10日 16:01
  • 3095

用asp.net还原与恢复sqlserver数据库

需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程: create proc killspid (@dbname ...
  • make1828
  • make1828
  • 2014年05月07日 08:48
  • 777

.NET MVC 入门+连接数据库(SQL SERVER)

http://www.w3school.com.cn/aspnet/mvc_intro.asp
  • novia1234
  • novia1234
  • 2014年08月19日 10:55
  • 2897

c#向SQL Server中存储图片并且再从数据库中读取图片

前言数据库课程设计答辩时,老师提出了如果数据是图片或者其他文件类型的时候,顿时觉得自己做的管理系统用到的较多的就是Char类型。于是,答辩结束后,就搜集资料学习,在查找资料的时候发现,有的一开始并不能...
  • sinat_27714067
  • sinat_27714067
  • 2016年07月01日 17:08
  • 4719

sql server数据库保存图片或者其他小文件

测试用sql server数据库保存图片或者其他小文件。 文件流字段用varbinary类型。 static void Main() { ...
  • pukuimin1226
  • pukuimin1226
  • 2013年12月26日 14:28
  • 8656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET存取SQL Server数据库图片
举报原因:
原因补充:

(最多只允许输入30个字)