BlogEngine SqlProvider

in Develop

昨天晚上试着将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 Comments

10 Comments

  1. 所以只适合数据量小的网站。不过BlogEngine确实有很多优秀的地方,我看了源代码,获益匪浅!

  2. 文章多了也没事呀,我100篇文章,大小也就5M,一次载入是不是也会只占用5M内存那?这样的大小服务器是可以忍受的吧?即使1000篇文章,也才50M内存。

  3. 它的cpu占用不低
    特别是在load时,飚升

  4. 这个原因是你是放在xml里,需要读取大量文件。如果放在SQL里,查询1000篇文章,应该也没问题的。你可以测试下。

  5. @benben:
    是啊
    纯文件的IO读取比sql的IO大多了

  6. 哈哈,赶快研究吧。

  7. @benben:
    你说你昨天在研究rss输出?
    啥意思?

  8. 设想是这样的,在RSS输出里每篇文章加上相关文章,后来发现相关文章类不在Coro里,需要重新写,搞了半天也没搞定。

  9. 支持一下。

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>