科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET如何存取SQL Server数据库图片

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SQL Server提供了一个特别的数据类型:image,它是一个包含binary数据的类型

作者:huanghai 来源:yesky 2007年11月8日

关键字: ASP.NET SQL Server 数据库图片 Windows

  • 评论
  • 分享微博
  • 分享邮件
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();

}

}
}

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章