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
相关文章
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
1月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
2月前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
3月前
|
SQL 存储 监控
如何在SQL中插入图片
如何在SQL中插入图片
|
3月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
41 4
|
3月前
|
关系型数据库 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)")
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
19 3
|
3天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
23 2