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

  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/hieroly/p/15684349.html
Copyright © 2011-2022 走看看