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

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

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 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
163 3
|
8天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
8天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
9天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
19天前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
16 2
|
24天前
|
SQL JSON Java
没有数据库也能用 SQL
SPL(Structured Process Language)是一款开源软件,允许用户直接对CSV、XLS等文件进行SQL查询,无需将数据导入数据库。它提供了标准的JDBC驱动,支持复杂的SQL操作,如JOIN、子查询和WITH语句,还能处理非标准格式的文件和JSON数据。SPL不仅简化了数据查询,还提供了强大的计算能力和友好的IDE,适用于多种数据源的混合计算。
|
26天前
|
SQL 数据库
SQL数据库基础语法入门
[link](http://www.vvo.net.cn/post/082935.html)
|
1月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
45 0
|
1月前
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
|
1月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析