使用 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结束符号。如下图上半部分是表格,下半部部分是存储过程。

image

对于非存储过程类的SQL直接zDDLScript  : TZSQLProcessor,执行即可。

  • 对于存储过程相关,需要特别指明

zDDLScriptSP.DelimiterType := TZDelimiterType.dtDelimiter;
zDDLScriptSP.Delimiter     := ';;';

对应的存储过程文件的内容也要做处理,我用的是Notepad2-mod,直接查找替换

  1. ”;\r\ndelimiter ;;”  替换成  ”\r\n;;”
  2. ”delimiter ;\r\n”  替换成  ””
  3. 一定要确保 Delimiter 定义的字符串在一行!否则TZSQLProcessor不能正常处理!

image

至此功能完成。

如果有更好的方法,请各位指正。

  • 后记:

这里Navicat能很好做到导出结束符号“;;”在单独一行,HeidiSQL的结束符号是 “//” 就在语句的最末尾,需要再次利用文本工具替换,增加了复杂度,而且可以看到表格和存储过程在一起如下图。

image--- the end ---

posted @ 2021-12-13 17:23  海利鸟  阅读(229)  评论(0编辑  收藏  举报