昨天晚上试着将XmlProvider转换成SqlProvider
要做的第一件事就是数据上的转移
这个倒好办
<script runat="server">
    protected void Update(object sender, EventArgs e)
    {
        int i = 0;
        string folder = Server.MapPath("~/app_data/posts/");
        BlogEngine.Core.Providers.XmlBlogProvider p = new BlogEngine.Core.Providers.XmlBlogProvider();
        BlogEngine.Core.Providers.MSSQLBlogProvider sql = new BlogEngine.Core.Providers.MSSQLBlogProvider();
        System.Collections.Generic.List<BlogEngine.Core.Post> posts = new List<BlogEngine.Core.Post>();
        foreach (string file in System.IO.Directory.GetFiles(folder, "*.xml", SearchOption.TopDirectoryOnly))
        {
            FileInfo info = new FileInfo(file);
            string id = info.Name.Replace(".xml", string.Empty);
            //Post post = SelectPost(new Guid(id));
            Post post = p.SelectPost(new Guid(id));

            posts.Add(post);
        }
        foreach (BlogEngine.Core.Category item in p.FillCategories())
        {
            sql.InsertCategory(item);
        }
        foreach (BlogEngine.Core.Post item in posts)
        {
            BlogEngine.Core.Post post = item;
            try
            {
                sql.InsertPost(post);
                i++;
            }
            catch { }
        }
        List<BlogEngine.Core.Page> Pages = new List<BlogEngine.Core.Page>();
        folder = Server.MapPath("~/app_data/pages/");
        foreach (string file in System.IO.Directory.GetFiles(folder, "*.xml", SearchOption.TopDirectoryOnly))
        {
            FileInfo info = new FileInfo(file);
            string id = info.Name.Replace(".xml", string.Empty);
            //Post post = SelectPost(new Guid(id));
            BlogEngine.Core.Page page = p.SelectPage(new Guid(id));

            sql.InsertPage(page);
        }

        Response.Write(i);
    }
</script>

同时上面的代码是通用的,有需要的朋友可以直接拿去使用。

数据转换成功后,更改web.config中的defaultProvider
运行时发现有很多的问题,
最多的是发生在这一段代码上
string sqlQuery = "SELECT PostID, Title, Description, PostContent, DateCreated, " +
                          "DateModified, Author, IsPublished, IsCommentEnabled, Raters, Rating, Slug " +
                          "FROM be_Posts " +
                          "WHERE PostID = @id";
      SqlCommand cmd = new SqlCommand(sqlQuery, providerConn);
      cmd.Parameters.Add(new SqlParameter("@id", id.ToString()));
      SqlDataReader rdr = cmd.ExecuteReader();
     //注意这里
      post.Id = rdr.GetGuid(0);
      post.Title = rdr.GetString(1);

没有进行SqlDataReader.Read()判断,当数据存在问题时这行就会报错
昨晚折腾不小,最终放弃了它自带的sqlprovider
想自己写一个,改一下FillPosts()方法,增加几个重载,如分页等。
这几个provider最大的问题是一次性将所有Posts载入内存,xmlProvider如此,sqlprovider也如此

相关文章

10 Responses

  1. 小灰 七月 22 2008 , 09:57
    小灰
    所以只适合数据量小的网站。不过BlogEngine确实有很多优秀的地方,我看了源代码,获益匪浅!
    #1
  2. benben 七月 22 2008 , 10:55
    benben
    文章多了也没事呀,我100篇文章,大小也就5M,一次载入是不是也会只占用5M内存那?这样的大小服务器是可以忍受的吧?即使1000篇文章,也才50M内存。
    #2
  3. 幻想曲 七月 22 2008 , 11:42
    幻想曲
    它的cpu占用不低
    特别是在load时,飚升
    #3
  4. benben 七月 22 2008 , 12:32
    benben
    这个原因是你是放在xml里,需要读取大量文件。如果放在SQL里,查询1000篇文章,应该也没问题的。你可以测试下。
    #4
  5. 幻想曲 七月 22 2008 , 13:24
    幻想曲
    @benben:
    是啊
    纯文件的IO读取比sql的IO大多了
    #5
  6. benben 七月 22 2008 , 15:11
    benben
    哈哈,赶快研究吧。
    #6
  7. 幻想曲 七月 22 2008 , 16:33
    幻想曲
    @benben:
    你说你昨天在研究rss输出?
    啥意思?
    #7
  8. benben 七月 22 2008 , 19:55
    benben
    设想是这样的,在RSS输出里每篇文章加上相关文章,后来发现相关文章类不在Coro里,需要重新写,搞了半天也没搞定。
    #8
  9. 邃森泓鮫 七月 22 2008 , 23:27
    邃森泓鮫
    学习ing.
    #9
  10. led 七月 23 2008 , 10:36
    led
    支持一下。
    #10

Write a comment:



(将显示你的Gravatar图标)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

评论提交有问题?