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

简介:

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 C;
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(); 
C +  " 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();
C +  " 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();
}
}
} 



本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2008/01/17/1042841.html,如需转载请自行联系原作者

相关文章
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1814 152
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1242 156
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
921 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
542 5
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
1646 0
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
870 0
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
592 13
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
SQL 人工智能 数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
1190 0
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库