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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章