关于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