使用 Zeos 批量处理SQL脚本和Zeos的中文数据问题
目的:程序启动运行时,可以在启动过程中将默认数据库创建。
方向:使用Zeos 的 TZSQLProcessor,处理批量SQL脚本,其他的组建也是有相关的类。
为了批量方便,这里定义了两种类型的的SQL,虽然都是DDL 但,后者与存储过程相关。
zDDLScript : TZSQLProcessor;
zDDLScriptSP: TZSQLProcessor;
- 关于中文和连接协议版本
项目测试用的数据库是 MariaDB,这里附带提一下,数据库的驱动还是用的mysql-5,使用MariaDB-10总提示找不到驱动,虽然明确指明驱动位置。
zCon := TZConnection.Create(nil); try with zCon do begin HostName := _DBserver; Database := _database; // Protocol := 'MariaDB-10'; Protocol := 'mysql-5'; User := _UserName; Password := _Password; ControlsCodePage := TZControlsCodePage.cCP_UTF8; ClientCodepage := 'utf8'; AutoCommit := true; end;
中文数据是乱码,需要用到 ControlsCodePage := TZControlsCodePage.cCP_UTF8;这一句是关键。
我尝试在代码中比如遇到中文用 Utf8Endoce,或 AnsiToUtf8 或Utf8toAnsi 等若干尝试均无效,当配置了ControlsCodePage 属性,Delphi下不用做任何转换中文正常,包括注释中文均正常,但翻看Lazarus的实现,还是用了UTF8ToConsole 、 UTF8ToSys 和UTF8ToWinCP做转换的。
- 数据库表格部分
用可视化工具导出构建好的SQL是很方便的事情,自带的HeidiSQL和Navicat for MariaDB 均可以很好的导出(当然还有好多其他的工具比如EMS SQL Manager,它其实是以前最喜欢用的工具)。
但HeidiSQL、Navicat 这两个产品导出的SQL还是有些不同,细节撇开,Zeos因为组件功能的限制(也许是我没用好),含存储过程的很难处理。HeidiSQL将导出的SQL按字母顺序杂糅在一起,Navicat 可以将存储过程放到一起(它是根据功能树顺序)。
这里将导出的文件分成两半一部分叫“TabNew.sql”保存表格建立, 一部分叫“ProcNew.sql” 保存存储过程相关,因为它会重新定义SQL结束符号。如下图上半部分是表格,下半部部分是存储过程。
对于非存储过程类的SQL直接zDDLScript : TZSQLProcessor,执行即可。
- 对于存储过程相关,需要特别指明
zDDLScriptSP.DelimiterType := TZDelimiterType.dtDelimiter;
zDDLScriptSP.Delimiter := ';;';
对应的存储过程文件的内容也要做处理,我用的是Notepad2-mod,直接查找替换
- ”;\r\ndelimiter ;;” 替换成 ”\r\n;;”
- ”delimiter ;\r\n” 替换成 ””
- 一定要确保 Delimiter 定义的字符串在一行!否则TZSQLProcessor不能正常处理!
至此功能完成。
如果有更好的方法,请各位指正。
- 后记:
这里Navicat能很好做到导出结束符号“;;”在单独一行,HeidiSQL的结束符号是 “//” 就在语句的最末尾,需要再次利用文本工具替换,增加了复杂度,而且可以看到表格和存储过程在一起如下图。