仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 641|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页设计各类范例文件在SQL Server中存储的办理...

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:24:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我们分析上面的两个操作,都有一个“删除数据”的过程。server|办理数据的耐久化是开辟的基本性事情,我们不成制止要将各类的范例文件耐久化,关于文件(或是年夜工具)的存储,我在我的bloghttp://www.ckuyun.com/supercode/articles/156744.html谈过
明天我们从计划的角度来完成这功效,从本文中您将懂得道以下内容
lSQLServer中的数据范例
l数据表,存储历程的计划
l逻辑层完成各类范例文件的主动转化
lDataGrid中的自界说文件列表显现体例,和从服务端将文件发送客户端时的一些技能
1.Sqlserver中的数据范例

Unicode字符串
nchar
流动长度的Unicode数据,最年夜长度为4,000个字符。
nvarchar
可变长度Unicode数据,其最年夜长度为4,000字符。sysname是体系供应用户界说的数据范例,在功效上同等于nvarchar(128),用于援用数据库工具名。
ntext
可变长度Unicode数据,其最年夜长度为2^30-1(1,073,741,823)个字符。
二进制字符串
binary
流动长度的二进制数据,其最年夜长度为8,000个字节。
varbinary
可变长度的二进制数据,其最年夜长度为8,000个字节。
image
可变长度的二进制数据,其最年夜长度为2^31-1(2,147,483,647)个字节。

要想加倍具体的数据范例请查阅SqlServer自带的匡助文件,之以是把这几个排列出来是由于,网上良多伴侣常常问究竟用binary仍是用image作为存储的数据范例,很明显,应当用image,由于很少有文件小于8K的,除非是收集图象(jpeg,gif,png)

2.数据表,存储历程的计划
(1)创立表
上面是创立表的Sql
ifexists(select*fromdbo.sysobjectswhereid=object_id(N’[dbo].[FileLib]’)andOBJECTPROPERTY(id,N’IsUserTable’)=1)
droptable[dbo].[FileLib]
GO

CREATETABLE[dbo].[FileLib](
[ID][int]IDENTITY(1,1)NOTNULL,
[FName][nvarchar](255)COLLATEChinese_PRC_CI_ASNULL,
[FileType][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[FileContent][image]NULL,
[FileSize][float]NULL,
[FileUploader][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[UploadDate][datetime]NULL,
[Icon][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]
GO

干系图以下




存储文件的表
(2)创立存储历程
1.写进数据库的存储历程
/**//************************************************************
*Purpose:TestForUpLoadFileToSqlServer*
*Author:登峰*
*Blog:http://www.ckuyun.com/supercode*
*Date:2005-6-12*
*****************************************************************/

CREATEprocSetFileToDB
@_FileNameasnvarchar(255)=null,
@_FileTypeasnvarchar(50)=null,
@_FileContentasimage=null,
@_FileSizeasint=null,
@_FileUploaderasnvarchar(50)=null,
@_UploadDateasdatetime=null,
@_Iconasnvarchar(50)=null
AS

--声明SQL变量
declare@CreateTabSqlasnvarchar(100);

--声明毛病处置变量
declare@CurrentErrorint




--事件入手下手
BEGINTRANSACTION
--拔出表
insertintoFileLib(FName,FileType,FileContent,FileSize,FileUploader,UploadDate,Icon)
values(@_FileName,@_FileType,@_FileContent,@_FileSize,@_FileUploader,@_UploadDate,@_Icon)



select@CurrentError=@@Error
IF@CurrentError!=0
BEGIN
GOTOERROR_HANDLER
END

--事件停止
COMMITTRANSACTION

--乐成的话前往0
RETURN0
ERROR_HANDLER:
ROLLBACKTRANSACTION
RETURN@CurrentError
GO
3.逻辑层完成各类范例文件的主动转化
援用这层的目标就是扼要申明一上层次的成绩,原本数据层也自力出来,但这文章的目标不在于此,以是附带而过,并且这逻辑层也十分复杂,为了便利起见,把相干的类和操纵都放在一同文件里
(3.1)界说文件实体类
classFileEntity
{
privateint_ID;
privatestring_FileName;
privatestring_FileType;
privatebyte[]_FileContent;
privateint_FileSize;
privatestring_FileUploader;
privateDateTime_UploadDate;
privatestring_Icon;

属性#region属性

publicintID
{
set{_ID=value;}
get{returnID;}
}

publicstringFileName
{
set{_FileName=value;}
get{return_FileName;}
}

publicstringFileType
{
set{_FileType=value;}
get{return_FileType;}
}

publicbyte[]FileContent
{
set{_FileContent=value;}
get{return_FileContent;}
}

publicintFileSize
{
set{_FileSize=value;}
get{return_FileSize;}
}

publicstringFileUploader
{
set{_FileUploader=value;}
get{return_FileUploader;}
}

publicDateTimeUploadDate
{
set{_UploadDate=value;}
get{return_UploadDate;}
}

publicstringIcon
{
set{_Icon=value;}
get{return_Icon;}
}

#endregion

}
(3.2)扩大名和图标的处置
要想在列内外完成哪一种范例的文件对应哪一种图标,这需求关联系关系,数据库中Icon就是来保留文件的扩大名的,看上面两个处置办法
/**////<summary>
///从当地的全名路径(含文件名)中猎取文件名
///</summary>
///<paramname="path">全名路径(含文件名)</param>
///<returns>文件名</returns>
privatestringGetFileName(stringpath)
{
intindex=path.LastIndexOf("");
returnpath.Substring(index+1);

}
/**////<summary>
///从当地的全名路径(含文件名)中猎取文件的扩大名
///</summary>
///<paramname="path">全名路径(含文件名)</param>
///<returns>文件的扩大名</returns>
privatestringGetExteName(stringpath)
{
intindex=path.LastIndexOf(".");
returnpath.Substring(index+1);
}





4.页面的完成
4.1页面HMTL的形貌
确信你设定了Form的encType属性为multipart/form-data。显现文件列表的关头是DataGird,先看看他的形貌
<asp:DataGridid="DataGrid1"AutoGenerateColumns="False"style="Z-INDEX:101;LEFT:120px;POSITION:absolute;TOP:88px"
runat="server"Width="664px"Height="152px"BorderColor="#CC9966"BorderStyle="None"BorderWidth="1px"
BackColor="White"CellPadding="4">
<FooterStyleForeColor="#330099"BackColor="#FFFFCC"></FooterStyle>
<SelectedItemStyleFont-Bold="True"ForeColor="#663399"BackColor="#FFCC66"></SelectedItemStyle>
<ItemStyleForeColor="#330099"BackColor="White"></ItemStyle>
<HeaderStyleFont-Bold="True"ForeColor="#FFFFCC"BackColor="#990000"></HeaderStyle>
<PagerStyleHorizontalAlign="Center"ForeColor="#330099"BackColor="#FFFFCC"></PagerStyle>
<Columns>
<asp:TemplateColumnHeaderText="图标">
<ItemTemplate>
<imgsrc=http://www.pushad.com/Info/’images/<%#(DataBinder.Eval(Container.DataItem,"Icon").ToString())%>.gif’/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumnHeaderText="文件名">
<ItemTemplate>
<ahref=WebForm1.aspx?fid=<%#DataBinder.Eval(Container.DataItem,"FID")%>><%#DataBinder.Eval(Container.DataItem,"FName")%></a>

</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumnHeaderText="外部范例">
<ItemTemplate>
<asp:Labelid="FileName"runat="server"Text=’<%#DataBinder.Eval(Container.DataItem,"FileType")%>’/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumnHeaderText="文件巨细">
<ItemTemplate>
<asp:Labelid="FileSize"runat="server"Text=’<%#DataBinder.Eval(Container.DataItem,"FileSize","{0:N}")%>’/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumnHeaderText="上传者">
<ItemTemplate>
<asp:Labelid="FileUploader"runat="server"Text=’<%#DataBinder.Eval(Container.DataItem,"FileUploader")%>’/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumnHeaderText="上传日期">
<ItemTemplate>
<asp:Labelid="UploadDate"Text=’<%#DataBinder.Eval(Container.DataItem,"UploadDate","{0:yyyy-MM-dd}")%>’runat="server"/>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>


4.2把DB中的文件显现在DataGrid上,由于仅仅是显现,以是FileContent字段没有需要读出来,并且在这里我们自界说一个DataTable来绑定到DataGrid中,请看上面的代码
1/**////<summary>
2///从数据库中读取文件信息显现在DataGrid上
3///</summary>
4privatevoidBindGrid()
5{
6
7stringSelectCommand="selectID,FName,FileType,FileSize,FileUploader,UploadDate,IconfromFileLib";
8
9SqlConnectionmyConnection=null;
10try
11{
12myConnection=newSqlConnection(ConnectionString);
13myConnection.Open();
14
15SqlCommandsqlcmd=newSqlCommand(SelectCommand,myConnection);
16
17
18SqlDataReaderddr=sqlcmd.ExecuteReader();
19
20DataTabledt=newDataTable();
21DataRowdr;
22dt.Columns.Add(newDataColumn("FileType",typeof(string)));//0
23dt.Columns.Add(newDataColumn("FName",typeof(string)));//1
24dt.Columns.Add(newDataColumn("FileSize",typeof(string)));//2
25dt.Columns.Add(newDataColumn("FileUploader",typeof(string)));//3
26dt.Columns.Add(newDataColumn("UploadDate",typeof(string)));//4
27dt.Columns.Add(newDataColumn("Icon",typeof(string)));//5
28dt.Columns.Add(newDataColumn("FID",typeof(string)));//6
29
30
31while(ddr.Read())
32{
33dr=dt.NewRow();//新一行
34dr[0]=ddr["FileType"].ToString();
35dr[1]=ddr["FName"].ToString();
36dr[2]=ddr["FileSize"].ToString();
37dr[3]=ddr["FileUploader"].ToString();
38dr[4]=ddr["UploadDate"].ToString();
39dr[5]=ddr["Icon"].ToString();
40dr[6]=ddr["ID"].ToString();
41dt.Rows.Add(dr);
42
43}
44//绑字到DataGrid
45DataGrid1.DataSource=newDataView(dt);
46DataGrid1.DataBind();
47}
48catch(System.ExceptionEx)
49{
50Response.Write(Ex.Message+Ex.StackTrace);
51}
52finally
53{
54myConnection.Close();
55}
56}
4.3上传文件至SqlServer数据库
IIS对上传的巨细是很限制,固然这在web.config中设置,详细的这里不胪陈,再查阅相干的材料,我们先把页面级的字段放在文件实体类中,再将实体类传到逻辑层来处置,三层的道理也是云云,上面是初始化提交卸码
voidInitEntity()
{
//读取相干值
FileEntityfe=newFileEntity();
StreamDataStream=File1.PostedFile.InputStream;//文件流
fe.FileSize=File1.PostedFile.ContentLength;//文件长度

byte[]bdata=newbyte[fe.FileSize];
intn=DataStream.Read(bdata,0,fe.FileSize);//全体读取缓冲,n代表实践读取字节数

fe.FileContent=bdata;
fe.FileName=GetFileName(File1.PostedFile.FileName);//全称
fe.FileUploader=this.txtUploader.Text;
fe.FileType=File1.PostedFile.ContentType;
fe.UploadDate=DateTime.Now;
fe.Icon=GetExteName(File1.PostedFile.FileName);


//入手下手写进数据库
UpLoadFileToDB(fe);

}


上面的代码是写进数据库的代码
/**////<summary>
///上传文件至数据库
///</summary>
privatevoidUpLoadFileToDB(FileEntityfe)
{
SqlConnectionmyConnection=null;
try
{
myConnection=newSqlConnection(ConnectionString);

SqlCommandcommand=newSqlCommand("SetFileToDB",myConnection);
command.CommandType=CommandType.StoredProcedure;

command.Parameters.Add("@_FileName",fe.FileName);
command.Parameters.Add("@_FileType",fe.FileType);
command.Parameters.Add("@_FileContent",fe.FileContent);
command.Parameters.Add("@_FileSize",fe.FileSize);
command.Parameters.Add("@_FileUploader",fe.FileUploader);
command.Parameters.Add("@_UploadDate",fe.UploadDate);
command.Parameters.Add("@_Icon",fe.Icon);

myConnection.Open();
intResult=command.ExecuteNonQuery();

BindGrid();
}
catch(Exceptionex)
{
Response.Write(ex.Message+ex.StackTrace);
}
finally
{
myConnection.Close();
}
}
4.4下载文件时的处置历程
固然这是也是最关头的,否则没意义了,固然这会触及到小成绩,好比,下载时的中文乱码成绩,对jpeg或word文件是下载仍是间接在IE中翻开等成绩,这些成绩我都已鄙人面的代码中办理
/**////<summary>
///将文件发给客户端,fid是本面Load时从Request读取的
///</summary>
///<paramname="fid">文件编号</param>
voidDownLoadFile(intfid)
{
SqlConnectionmyConnection=null;

stringstrDownloadSql="selectFileType,FName,FileContentfromFileLibwhereID="+fid;

try
{
myConnection=newSqlConnection(ConnectionString);
myConnection.Open();

SqlCommandsqlcmd=newSqlCommand(strDownloadSql,myConnection);
SqlDataReaderddr=sqlcmd.ExecuteReader();
if(ddr.Read())
{

Response.ContentType=ddr["FileType"].ToString();

Response.AddHeader("Content-Disposition","attachment;FileName="+HttpUtility.UrlEncode(ddr["FName"].ToString(),System.Text.Encoding.UTF8));

Response.BinaryWrite((byte[])ddr["FileContent"]);
Response.End();

}

}

catch(Exceptionex)
{
Response.Write(ex.Message+ex.StackTrace);
}
finally
{
myConnection.Close();
}
}
好,文章到这也行将停止,最初我们来看看终极的DEMO效果




文件上传后

上面看看下载时的效果



文件下载

到此半途而废,固然您也能够在这基本之上把功效再加年夜,好比完成编纂,目次体例等,明天是周未,登峰祝您周未兴奋!MyISAMMysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
精灵巫婆 该用户已被删除
沙发
发表于 2015-1-19 10:54:55 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-25 16:50:28 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
透明 该用户已被删除
地板
发表于 2015-2-3 11:20:25 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
第二个灵魂 该用户已被删除
5#
发表于 2015-2-8 20:28:01 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-26 05:04:57 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
admin 该用户已被删除
7#
发表于 2015-3-8 12:10:57 | 只看该作者
从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
8#
发表于 2015-3-15 22:57:52 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-22 17:35:00 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表