none
新闻管理系统中存储新闻内容的问题 RRS feed

  • 问题

  • 我做一个新闻管理系统,其中的新闻表结构如下:
    表结构如下:
    CREATE   TABLE   [dbo].[News_News](
    [NewsID]   [int]   IDENTITY(1,1)   NOT   NULL,
    [CategoryID]   [int]   NOT   NULL,
    [Title]   [varchar](200)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL,
    [Gdzh]   [varchar](100)   COLLATE   Chinese_PRC_CI_AS   NULL,
    [Image]   [varchar](50)   COLLATE   Chinese_PRC_CI_AS   NULL,
    [Body]   [varbinary](max)   NOT   NULL,
    [ReleaseDate]   [datetime]   NOT   NULL   CONSTRAINT   [DF_News_News_ReleaseDate]     DEFAULT   (getdate()),
    [ExpireDate]   [datetime]   NOT   NULL,
    [AddedDate]   [datetime]   NOT   NULL   CONSTRAINT   [DF_News_News_AddedDate]     DEFAULT   (getdate()),
    [Approved]   [bit]   NOT   NULL   CONSTRAINT   [DF_News_News_Approved]     DEFAULT   ((0)),
    [Hit]   [int]   NOT   NULL   CONSTRAINT   [DF_News_News_Hit]     DEFAULT   ((0)),
    [UserId]   [uniqueidentifier]   NULL,
    [FileType]   [varchar](255)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   CONSTRAINT   [DF_News_News_FileType]     DEFAULT   ('html'),
      CONSTRAINT   [PK_News_News]   PRIMARY   KEY   CLUSTERED  
    (
    [NewsID]   ASC
    )WITH   (PAD_INDEX     =   OFF,   IGNORE_DUP_KEY   =   OFF)   ON   [PRIMARY]
    )   ON   [PRIMARY]
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    News_News表中的body字段为varbinary(max)类型,用来存放 asp.net页面中CuteEditor文本编辑器的内容,也就是新闻的内容.按下添加新闻按钮,大概的代码如下:
                   // 获取其它的参数,以便准备添加到新闻表(简略) 
                    DateTime releasedate = Convert.ToDateTime(TxtReleaseDate.Text);
                    DateTime expiredate = Convert.ToDateTime(TxtExpireDate.Text);

                   byte[] body = System.Text.Encoding.UTF8.GetBytes(this.Editor1.Text); //这里获取CuteEditor文本编辑器的内容
                  nb.InsertNews(parentid, txtTitle.Text,gdzh, image, body, releasedate, expiredate, adddate, CheckBoxApproved.Checked, 0, userid,"html");//添加记录
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------
    News_News表中的FileType为文件类型后缀字段,用default来标识只要添加一条记录就会在这个字段自动添加上'html;
    (因为我想用sql server的全文索引) ,问题在这里,我应该用什么后缀呢,我个人认为应该为HTML?(我应用了全文索引后,无法找到任何记录,和这个有关系吗?)
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    这是读取新闻时取body字段的代码
                                                    System.Text.Encoding.UTF8.GetString(dt[0].Body)
    --------------------------------------------------------------------------------

    建立全文索引的过程:

    首先数据库及表启用了全文索引

    我建立了目录   CREATE   FULLTEXT   CATALOG   ft_putnews

    建立索引
    CREATE   FULLTEXT   INDEX   ON   dbo.News_News
    (
            Body                                                    
                    TYPE   COLUMN   FileType        
                    Language   0X0                                  
    )
    KEY   INDEX   pk_news_news   ON   ft_putnews1  
    WITH   CHANGE_TRACKING   AUTO                        
    GO

    然后就用   freetext查找

    select   title   from   news_news
    where   freetext(body,'附则')

    结果里没有任何记录,换了好几个关键词,同样找不到记录
    2008年1月4日 9:54

答案

  • 我只是猜测。

    varbinary是存放二进制数据的类型,也就是说,不管原来是什么内容,放到这个类型的字段之后,都当做二进制数据对待,而,freetext(body,'附则') ,“附则”是一个字符串,不知道Sql Server有足够的智能把它转换成二进制,然后再到Body里面搜索?不知道楼主要是把varbinary(max)类型变成varchar(max)类型之后是否会有效果,因为body的内容其实都是字符。

    换成varchar(max)之后,你保存的代码不需要再转换成byte[]。

    试试吧。

    2008年1月4日 10:32
    版主

全部回复

  • 我只是猜测。

    varbinary是存放二进制数据的类型,也就是说,不管原来是什么内容,放到这个类型的字段之后,都当做二进制数据对待,而,freetext(body,'附则') ,“附则”是一个字符串,不知道Sql Server有足够的智能把它转换成二进制,然后再到Body里面搜索?不知道楼主要是把varbinary(max)类型变成varchar(max)类型之后是否会有效果,因为body的内容其实都是字符。

    换成varchar(max)之后,你保存的代码不需要再转换成byte[]。

    试试吧。

    2008年1月4日 10:32
    版主
  • varchar(max)    或 Text 都是更好的选择。

    2008年1月4日 13:51
  • 谢谢  RickyLin,那我有什么方法能在已存在了很多数据的情况下将varbinary(max)安全地转换成varchar(max)类型?
    2008年1月5日 1:08
  • 你可以在表里新增一个varchar(max)的字段,然后写一个程序,循环表中的每一行,从varbinary(max)类型的字段中还原出数据,然后Update到新建的varchar(max)类型的字段里去就行了,最后删掉varbinary(max)类型的字段

    2008年1月5日 3:44
    版主
  • 感谢 RickyLin,我犯了一个低级错误,如果要将文本大数据进行存储,就用varchar(max)或nvarchar(max),要是用varbinary(max),以后用全文索引是找不到记录的,另外,再请关注一下asp.net2.0中关于TreeView 状态的问题 !!!现在已经能保存treeview状态,但新的问题来了
    2008年1月5日 14:40
  • 如果将在Web页面编辑好的新闻内容直接存储在数据库中,个人认为不是一种好的策略。建议保存成文件更好。

    2008年1月8日 16:10
  • 你好,你是说保存成文件更好?能说一下它的优点吗?另外,能推荐这样的程序源码吗?
    2008年1月9日 6:57
  • 汗,楼主把解答放到了自己头上……

    保存成文件,似乎也不太好,因为日久天长,可能会形成很多小文件,如果用资源管理器打开存放新闻的目录的话,可能会很慢很慢……

    2008年1月9日 9:16
    版主