zoukankan      html  css  js  c++  java
  • 使用 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 ---

  • 相关阅读:
    一套代码小程序&Web&Native运行的探索05——snabbdom
    一套代码小程序&Web&Native运行的探索04——数据更新
    一套代码小程序&Web&Native运行的探索03——处理模板及属性
    一套代码小程序&Web&Native运行的探索02
    微信小程序开发07-列表页面怎么做
    微信小程序开发06-一个业务页面的完成
    微信小程序开发05-日历组件的实现
    微信小程序开发04-打造自己的UI库
    微信小程序开发03-这是一个组件
    30分钟ES6从陌生到熟悉
  • 原文地址:https://www.cnblogs.com/hieroly/p/15684349.html
Copyright © 2011-2022 走看看