一、项目背景
实现一个基于unigui的邮件发送系统(替代数据库邮件方式);
系统要求
要求点:
1、数据访问
数据库连接组件访问,不需要前后端分离或者其它语言来实现;
2、系统部署
Windows+Linux 均能正常部署;
功能要求
1、定时推送
基于推送池(任务表)数据写入,按照一定时间间隔进行循环推送,同时反置更新推送数据,避免重复推送等;
2、Webapi接口
衍生webapi接口,用于其它业务系统实时调用(注册邮箱验证码或者其它实时通知信息);
3、Job任务实现
对于业务数据定期需要推送(可能每周、可能每天),可设置的任务调度来实现Job任务处理;
二、问题解决方案
1、数据库连接组件(Linux)
Windows 下部署均为以下异常;Linux下部署,才会出现以下异常;
Unidac 版本(8.4.2) Firedac(Delphi 10.4.2 自带)
1.1 字符串乱码问号(Unidac)
直连Sql server,中文字符显示???,字符集存在异常;
解决办法:字段修改为nvarchar,由于项目是需要动态读取数据库数据,每个字段都进行修改nvarchar
缺点:每个字段都修改nvarchar(汉字两个字节),对于动态查询不太友好,同时字段转nvarchar,工作量较大;
1.2 字段截取(Firedac)
解决方案一、
方法1:
FormatOptions.MapRules.Add(dtWideString,dtWideMemo);
FormatOptions.MapRules.Add(dtAnsiString,dtWideMemo);
上述方法是将字符串类型字段映射为Memo类型的字段,能正确显示长度;
缺点:字段全部默认为Memo 数据,Dbgrid直接显示Memo,无法正确显示相关字段内容;可以通过fdmemtable 设置字段列来解决,也就是查询数据必须设定字段(对数据库动态字段查询极其不友好,工作量大)
方法2:
修改TFDConnection 下FormatOptions.StrsTrim2Len true,显示固定长度,显然不符合要求;
笔者解决方案为,windows默认unidac连接接口,linux采用odbc来访问数据,非常友好解决以上存在问题;
2、Job任务调度处理
对于需要定期执行(类似于数据库作业等),delphi或者unigui基于此类的跨平台以及定时作业执行相对比较薄弱;
解决方案:采用其它语言比较成熟的任务调度方案,同时跨平台支持较好;
笔者使用的.NET 的qurtz.ui来实现定期任务调度等;
三、方案设计处理
采用前后端一体化,采用数据库访问组件(unidac)来实现,采用qurtz.ui来弥补完善delphi目前任务调度不足的情况;
四、数据访问ODBC配置
1、Windows下配置;
自行百度即可解决,比较简单
2、Linux下配置
以ubuntu 24.04 版本为例
2.1 安装odbc -sqlserver驱动
一、安装odbc驱动;
https://learn.microsoft.com/zh-tw/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017&tabs=ubuntu18-install%2Cubuntu17-install%2Cubuntu16-install%2Credhat7-13-install%2Cubuntu-offline
二、安装库文件
sudo apt-get install tdsodbc
三、mssql工具
https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver16&tabs=ubuntu-install
sudo apt-get update
sudo apt-get install mssql-tools18 unixodbc-dev
四、数据库访问
sqlcmd -S server -C -U 用户名 -P 密码 -d 数据库名;
五、安装freetds( --with-tdsver=8.0 报错)
tar zxvf freetds-stable.tgz
sudo ./configure --prefix=/usr/local/freetds --enable-msdblib --with-gnu-ld --enable-shared --enable-static
make
make install
vim /etc/ld.so.conf
加入一行:/usr/local/freetds/lib
sudo ldconfig
--查看freetds
vim /etc/freetds/freetds.conf
cd /usr/local/freetds/bin/
./tsql -H your SQLserver addr -p 1433 -U 用户名 -P 密码 -D 数据库
注意你的密码有特殊字符例如 !和 # 之类的,那么需要加上转义符 \!\# ,这样就会被 freetds 识别。
六、检查odbc版本
odbcinst -j
isql -v DSN名称 用户名 密码