重复刚才的上传文件的过程,上传多个文件。
3.建立全文索引
下面对tianenImage的test表的fcontent列进行全文索引。由于它的类型是image,所以建立全文索引的方式与普通的字符串类型不同。
使用SQL语句来实现建立索引的方法如下所示:
——启用全文支持
use tianenImage
Exec sp fulltext database"enable"
——创建全文目录
Exec sp fulltext catalog"imageCatalog","create"
——注册用于全文检索的表
Exec sp fulltext table"test","create","imageCatalog","PK test"
——指定fcontent列为全文索引列fext是类型列
Exec sp fulltext column"test","fcontent","add",0x0804,"fext"
——激活全文索引
Exec sp fulltext table"test","activate"
——执行全文目录的填充
Exec sp fulltext catalog"imageCatalog","start full"
这里要注意黑体标注的语句。在SQL Server中,要对image类型列进行全文索引,就需要给它绑定一个列来标识类型。微软让我们采用扩展名的方式,其实不是很科学。想要标识一个文件的类型应使用MIME类型或者CLSID才可以。扩展名是很不准确的。
在查询分析器中执行了上面的SQL语句之后,就可以对fcontent列执行全文搜索了。运行以下语句:
use tianenImage
select*from test where contains(fcontent,′"大禹"")
那么,刚才的过程,如果使用企业管理器可视化操作,应该如何去做呢?
在企业管理器中,右键单击test表,从弹出的快捷菜单中依次选择“全文索引表”和“在表上定义全文索引”,打开“全文索引引导向”。
单击“下一步”,在“选择索引”对话框中选择唯一索引“PK test”,单击“下一步”。
在弹出的“选择表中的列”对话框中选择“fcontent”列用于全文检索,在“单词断字符的语言”列中选择“中文(中国)”,在“文档类型”列选择“fext”,这样就把两个列绑定到一起了。
单击“下一步”,在弹出的“选择目录”对话框中设置新建目录,名称为“imageCatalog”。
单击“下一步”,略过“调度”的设置,单击“完成”按钮完成全文索引的建立。
系统弹出成功建立全文索引的提示信息,单击“确定”。
在企业管理器中,右键单击tianen Image数据库的test表,从弹出的快捷菜单中依次选择“全文索引表”和“启动完全填充”即可实现完全填充。
4.8综合案例
4.8.1概要说明
本章的最后一个案例,将综合使用本章所学知识,开发一个在线文件管理系统。系统具有这样的功能:
上传文件到数据库中;
对二进制文件进行全文搜索;
可以将文件显示和下载;
可以查看系统中已经上传的文件。
在这个案例中,我们建立一个工程项目。使用的技术是ASP.NET1.1(基于VB.NET)+SQL Server2000。
工程包含三个文件,web.config用于存储数据库连接串;save.aspx是系统主界面,也用来上传文件;show.aspx用来提取数据库中的二进制数据并显示出文件。
4.8.2数据库结构
系统的数据库名为“love”,在这个数据库中建立一个表格,名为“yuanyuan”,其中含有五个字段。
id为int类型,自动增长,是表格的主键,主键约束名为loveyuanyuan。
fname为varchar(20)类型,是上传文件的名称。
ftype为varchar(20)类型,是上传文件的MIME类型。
fext为varchar(20)类型,是上传文件的扩展名。
021做自己的搜索引擎——搜索引擎精解案例教程fcontent为image类型,存储上传的文件。
通过在查询分析器中运行下面的SQL语句可以建立完成数据库。
create database love
use love
create table yuanyuan
(
id int identity(1,1)not null,
fname varchar(20)not null,——file name
ftype varchar(20)not null,——file MIME type
fext varchar(20)not null,——file extension
fcontent image not null,——file stored here
constraint loveyuanyuan primary key(id)
)
4.8.3程序和代码
web.config的代码如下:
<?xml version="1.0"encoding="gb2312"?>
<configuration>
<appSettings>
<add key="dsn"value="server=localhost;uid=sa;pwd=;database=love;"/>
</appSettings>
<system.web>
<trace enabled="false"/>
<compilation defaultLanguage="vb"debug="false"/>
<customErrors mode="RemoteOnly"/>
<authentication mode="Windows"/>
<authorization>
<allow users="*"/><!——允许所有用户——>
</authorization>
<identity impersonate="true"/>
<sessionState timeout="60"mode="InProc"cookieless="false"/>
<globalization requestEncoding="gb2312"responseEncoding="gb2312"/>
</system.web>
<startup>
<requiredRuntime version="v1.1.4322"/>
<supportedRuntime version="v1.1.4322"/>
</startup>
</configuration>
save.aspx的代码如下:
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
PublicClass save
Inherits System.Web.UI.Page
# Region"Web窗体设计器生成的代码"
"该调用是Web窗体设计器所必需的
<System.Diagnostics.DebuggerStepThrough()>Private Sub InitializeComponent()
End Sub
Protected WithEventsDGAs System.Web.UI.WebControls.DataGrid
Protected WithEvents Form1As System.Web.UI.HtmlControls.HtmlForm
Protected WithEventsButton1As System.Web.UI.WebControls.Button
Protected WithEvents upAs System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents lAs System.Web.UI.WebControls.Label
Protected WithEventsButton2As System.Web.UI.WebControls.Button
Protected WithEvents inputAs System.Web.UI.WebControls.TextBox
"注意:以下占位符声明是Web窗体设计器所必需的
"不要删除或移动它
Private designerPlaceholderDeclarationAs System.Object
Private Sub Page Init(ByVal senderAs System.Object,ByVal eAs System.EventArgs)Handles
MyBase.Init
′CODEGEN:此方法调用是Web窗体设计器所必需的
"不要使用代码编辑器修改它
InitializeComponent()
End Sub
# End Region
PrivateConnStr=System.Configuration.ConfigurationSettings.AppSettings("dsn")
Private Sub Page Load(ByVal senderAs System.Object,ByVal eAs System.EventArgs)HandlesMyBase.Load
′在此处放置初始化页的用户代码
BindGrid()
End Sub
SubBindGrid()
Dim connAs New SqlConnection(ConnStr)
Dim commAs New SqlCommand("select*from yuanyuan",conn)
Dim drAs SqlDataReader
Try
conn.Open()
dr=comm.ExecuteReader
DG.DataSource=dr
DG.DataBind()
Catch exAs Exception
If Not dr Is Nothing Then
dr.Close()
End If
If Not conn Is Nothing Then
conn.Close()
End If
End Try
End Sub
Private SubButton1Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)
HandlesButton1.Click
Dim fnameAs String=Path.GetFileName(up.PostedFile.FileName)
Dim ftypeAs String=up.PostedFile.ContentType
Dim fextAs String=Path.GetExtension(up.PostedFile.FileName)
Dim fcontent(up.PostedFile.ContentLength)AsByte
up.PostedFile.InputStream.Read(fcontent,0,up.PostedFile.ContentLength)
Dim connAs New SqlConnection(ConnStr)
Dim commAs New SqlCommand("insert into yuanyuan(fname,ftype,fext,fcontent)values
(@ fname,@ ftype,@ fext,@ fcontent)",conn)
comm.Parameters.Add("@ fname",fname)
comm.Parameters.Add("@ ftype",ftype)
comm.Parameters.Add("@ fext",fext)
comm.Parameters.Add("@ fcontent",fcontent)
Try
conn.Open()
comm.ExecuteNonQuery()
Dim tempAs String
temp="file name:"& fname
temp &="<br>file type:"& ftype
l.Text=temp
BindGrid()
Catch exAs Exception
l.Text=ex.Message
Finally
If Not conn Is Nothing Then
conn.Close()
End If
End Try
End Sub
Private SubButton2Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)
HandlesButton2.Click
Dim soAs String=input.Text.Trim
Dim sqlAs String="select* from yuanyuan whereCONTAINS(fcontent,′"""& so &"""")"