目的:程序啓動運行時,可以在啓動過程中將默認數據庫創建。
方向:使用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的結束符號是 “//” 就在語句的最末尾,需要再次利用文本工具替換,增加了複雜度,而且可以看到表格和存儲過程在一起如下圖。