代码改变世界

关于BlogEngine使用MYSQL的问题

2014-06-14 14:28  望陶分享  阅读(326)  评论(0编辑  收藏  举报

BlogEngine不容置疑是个非常优秀的开源项目,其中包含了不少作者优秀的思想在里面,值得我们这些程序猿们花点时间学习一下,这样的话网上已经很多人说过了,这里就不赘述了。

下面就谈谈我在使用BlogEngine 2.9版本的时候遇到的某些问题:
前面的部署都很简单,直接挂到iis中,选择一下4.0的应用程序池,之后就是修改其web.config
我是打算使用mariadb作为blogengine的数据库,所以需要使用mysql部分的配置
1、setup\MySQL目录中包含了mysql初始化脚本还有web.config
于是我就将MySQLWeb.Config重命名为web.config替换了根目录下的web.config
然后在mysql中创建了数据库“blogengine”,并执行MySQLSetup2.8.0.sql脚本
然 后仔细阅读了一下该目录下的“ReadMe.txt”文件,发现bin目录下还缺少MySQL .NET Connector组件,于是找到下载地址“http://dev.mysql.com/downloads/connector/net/”,是个安装 包,估计会自动注册到GAC中,不管,下载安装之后复制了其中的“MySql.Data.dll”到bin目录下(便于下次移植到其他环境),另外在 web.config中的找到DbProviderFactories看看其中对应的mysql provider的版本跟你下载的版本是否一致,不一致修改该版本号;


2、数据库初始化工作做完之后就修改web.config中的数据库连接
修改好之后我就尝试打开博客,发现打不开,错误是编译失败,因为之前使用默认的web.config是可以打开的,所以估计还是配置问题,所以尝试使用之前的web.config,然后在之前的web.config中将mysql的相关配置移至过去;
我先将

<system.data>
    <DbProviderFactories>
      <clear/>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" 
      type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
    </DbProviderFactories>
  </system.data>

这段代码复制到了原先的web.config中;
其次将

<blogProvider defaultProvider="XmlBlogProvider" fileStoreProvider="XmlBlogProvider">

中的defaultProvider="XmlBlogProvider"改为defaultProvider="DbBlogProvider"
最后的效果如下:

<blogProvider defaultProvider="DbBlogProvider" fileStoreProvider="XmlBlogProvider">
      <providers>
        <add description="Xml Blog Provider" name="XmlBlogProvider" type="BlogEngine.Core.Providers.XmlBlogProvider, BlogEngine.Core"/>
        <add connectionStringName="BlogEngine" description="Sql Database Provider" name="DbBlogProvider" type="BlogEngine.Core.Providers.DbBlogProvider, BlogEngine.Core"/>
      </providers>
</blogProvider>

最后就是修改连接字符串的配置

  <connectionStrings>
    <clear/>
    <add name="BlogEngine" connectionString="Server=***;Database=***;Uid=***;Pwd=***;" providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>

再次打开页面,发现还有问题,不过看起来之前的问题解决了,现在出现的问题是:

You have an error in your SQL syntax;

 

use near '[Key], [Value], [Attribute] FROM **_CustomFields


看似问题已经不大了,在mysql中字段名中存在关键字可以使用标记`,最简单的方式就是找到这段代码修改其中的查询语句,将字段处的‘[’改为‘`’,不过考虑到通用性,这边给出个人的一个解决方案:
解决该问题需要下载BlogEngine源码,其中包括BlogEngine.Core项目;
下载好之后使用vs打开并找到类“BlogEngine.Core\Providers\DbBlogProvider.cs”;
我们可以给该类添加两个变量叫做“fieldPrefix”、“fieldSuffix”(string),并在Initialize方法中从config数组中取值赋给这两个变量,代码如下:

           if (config["fieldPrefix"] == null)
            {
                config["fieldPrefix"] = "[";
            }
            this.fieldPrefix = config["fieldPrefix"];
            config.Remove("fieldPrefix");

            if (config["fieldSuffix"] == null)
            {
                config["fieldSuffix"] = "]";
            }
            this.fieldSuffix = config["fieldSuffix"];
            config.Remove("fieldSuffix");

 

加入这段代码之后就意味着在web.config中可以配置filedPrefix和fieldSuffix属性值,这样就可以通过动态配置字段前缀和后缀来解决类似问题,webconfig的配置如下:

<add connectionStringName="BlogEngine" fieldPrefix="`" fieldSuffix="`" description="Sql Database Provider" name="DbBlogProvider" type="BlogEngine.Core.Providers.DbBlogProvider, BlogEngine.Core"/>

该类修改后的源码在该文章最后可以下载
至此,我以为问题终于可以解决了,结果刷新了一下页面还是出错,

CustomFields找不到

蛋疼中...不过问题还是得解决...

于 是我打算把MSSQL中的初始化脚本拿过来对照,结果发现版本号就不一致,才明白过来我下载是2.9版本,怎么mysql初始化脚本最高就到2.8,没办 法,我把mssql中的脚本与mysql数据库脚本一对照,果然mysql初始化脚本中没有customfield表的创建脚本,于是重新创建了该表,再 次刷新页面,终于进去了...

我怕还有遗留的问题,所以每个功能都试过,发现还有问题,怎么会不支持中文呢?很多页面输入中文保存都失败, 查阅代码确认是支持中文的,所以我估计还是数据库的问题,所以仔细看了一下mysql的表设计,发现每个表都是这么设置的CHARSET=latin1, 默认字符集为latin1,为了确保编码一致,我觉得将它改为utf8试试,所以重新生成了sql脚本并将其中latin1都改为了utf8并重新创建数据库;

再试试,发现一切都正常了...

 

https://www.dropbox.com/s/27qfx3pd5yynrsz/DbBlogProvider.cs