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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

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( 040);
this.button1.Name =  " button1 ";
this.button1.Size =  new System.Drawing.Size( 26448);
this.button1.TabIndex =  0;
this.button1.Text =  " 加入新的图片 ";
this.button1.Click +=  new System.EventHandler( this.button1_Click);
//  
//  pic1
//  
   this.pic1.Location =  new System.Drawing.Point( 2808);
this.pic1.Name =  " pic1 ";
this.pic1.Size =  new System.Drawing.Size( 344264);
this.pic1.TabIndex =  3;
this.pic1.TabStop =  false;
//  
//  button2
//  
   this.button2.Location =  new System.Drawing.Point( 0104);
this.button2.Name =  " button2 ";
this.button2.Size =  new System.Drawing.Size( 26440);
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( 0152);
this.label2.Name =  " label2 ";
this.label2.Size =  new System.Drawing.Size( 26448);
this.label2.TabIndex =  5;
//  
//  Form1
//  
   this.AutoScaleBaseSize =  new System.Drawing.Size( 614);
this.ClientSize =  new System.Drawing.Size( 632273);
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,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
12天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
72 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
16天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
29 2
|
5天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
28天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
56 0
|
2月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
55 0
|
2月前
|
SQL 数据处理 数据库
|
15天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
17天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
152 11
|
2月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
12天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
55 13
MySQL的安装&数据库的简单操作
下一篇
无影云桌面