开发者社区> 老朱教授> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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(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数据库学习之路(九)
目录   数据库创建补充: 为数据库用户赋予权限 在数据库表中使用视图进行添加修改 数据库创建补充: 以文本格式显示自己创建的数据库表                                          以网格格式显示自己创建的数据库表 可以右键数据库--属性---选项,在选项中可以设置数据库的兼容性,还有是否可以让多人同时访问或者单人访问。
862 0
SQL数据库学习之路(练习)---C#登录界面连数据库
目录 C#登录界面连数据库 一、在数据库中先创建一个数据库。 二、在VS中创建C#的windows窗体应用程序 三、在VS中连接到数据库 四、设计登录界面 五、设置注册界面 六、将form1的按钮和form2进行关联 七、设置form2界面的注册按钮 八、form1的登录按钮设置 九、运行成果 参考文章: C#登录界面连数据库 一、在数据库中先创建一个数据库。
2723 0
SQL数据库学习之路(八)
数据库介绍: 在网页上的主程序中进行注册操作,然后把数据发送给人,人传递这些数据到数据库当中。   为什么学ADO.NET:之前我们所学的只能在查询分析器中查看数据,操作数据。
885 0
SQL数据库学习之路(七)
在SQL server managerment中可以点击帮助,会有帮助文档。 一、联合查询 将多个查询结果集合并成一个。
819 0
SQL数据库学习之路(六)
一、连接查询:当需要的结果需要从多张表中取时 关键问题:哪些表、关系(学生表的Id联系到班级表的Id) 内连接:inner join,两表中完全匹配的数据。
900 0
SQL数据库学习之路(四)
要求:通过SQL语句创建以下基本表:    教师关系 T(T#, TNAME,TITLE)    课程关系 C(C#,CNAME,T#)    学生关系 S(S#,SNAME,AGE,SEX)    选课关系SC(S#,C#,SCORE)    班级关系CLASS(CLASSID,CLASSNAME)    其中红色粗体为主键,带下划线的属性为外键。
812 0
SQL数据库学习之路(二)
(一)1.约束:实现数据的有效性检查---------主键(保证值是唯一的) 2.非空(输入的数据不允许为空) 3.唯一(存入的数据不能重复) 4.默认(自己不给数据添加值,值会默认添加) 5.检查(给值一个选定的范围) 6.外键(对关系的有效性进行检查,有关系才有外键) (二)脚本操作数据库 1.不区分大小写,字符串使用单引号,末尾不需要加分号。
802 0
SQL数据库学习之路(三)
一.表数据的操作 1.简单查询 select * from 表名 2.增加数据 insert into 表名(列名) values(值)                   ----要求值的列名与值要位置对应   ...
789 0
SQL数据库学习之路(一)
1.数据库简介(一个放数据的仓库)  解决的问题:持久化存储,优化读写,保证数据的有效性 关系型数据库:    基于E-R模型(实体-联系图Entity Relationship)    使用sq|语言进行操作(SQL...
1010 0
T-SQL查询:语句执行顺序
原文:T-SQL查询:语句执行顺序 读书笔记:《Microsoft SQL Server 2008技术内幕:T-SQL查询》   ===============  T-SQL查询的执行顺序 ===============      =============== T-SQL查询的示意图...
789 0
+关注
3545
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载