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
相关文章
|
15天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1天前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
24 9
|
19天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
70 6
|
29天前
|
数据库 Windows
SqlServer数据恢复—SqlServer数据库所在分区损坏的数据恢复案例
一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer数据库数据。
|
2月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
93 11
|
2月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
3月前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
3月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
139 4
|
3月前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统