.NET 8.0 Firebird连接器连接字符串异常:数据库路径自动添加/tmp/
我用.NET 8.0开发应用,要求数据库文件不存在时自动创建。调试时将Firebird Docker容器端口映射到本地3051,连接字符串如下:
datasource=localhost;database=\firebird\data\dbname.FDB;user id=SYSDBA;password=********;port number=3051;dialect=3;pooling=False;server type=0;character set=UTF8;connection lifetime=15;min pool size=0;max pool size=50;packet size=8192;wire crypt=Enabled
调用FbConnection.CreateDatabase("datasource=localhost;database=\firebird\data\subfolder\mydb.FDB;...", 8192)尝试在主机子文件夹创建数据库(目标路径为/firebird/data/subfolder/mydb.FDB)时,触发错误:
Use of database at location /tmp/\firebird\data\subfolder\mydb.FDB is not allowed by server configuration
相关疑问及补充:
- 路径中的
/tmp/是哪里来的? - 调试环境是Windows,部署用Linux Docker容器,存在斜杠兼容问题,Linux服务器上的错误信息为:
Use of database at location /tmp/firebird/data/Open/1.FDB is not allowed by server configuration
- 已确认主机子文件夹权限和
/firebird/data一致,能不能让FbConnection自动创建子目录?
1. /tmp/路径的由来
Firebird服务器在处理相对路径或者格式错误的绝对路径时,会默认把数据库文件放到服务器的临时目录(Linux下就是/tmp/,Windows对应系统临时目录)。你连接字符串里用了\firebird\data\...这种反斜杠路径,在Linux容器中属于无效的绝对路径(Linux路径分隔符是正斜杠/,反斜杠会被识别为普通字符,导致Firebird把整个路径当成相对路径),所以服务器自动将其转存到/tmp/下,而Firebird默认配置禁止在/tmp/创建数据库,因此报错。
2. 斜杠兼容问题的解决
- Windows调试环境:可以用Windows原生路径格式(比如
database=C:\firebird\data\subfolder\mydb.FDB),或者统一用正斜杠(Firebird客户端在Windows下也支持正斜杠路径)。 - Linux Docker部署环境:必须用Linux风格的正斜杠路径,且要注意路径是容器内部的路径(不是主机路径)。比如主机
/firebird/data映射到容器的/firebird/data,连接字符串里就要写database=/firebird/data/subfolder/mydb.FDB,不能用反斜杠。
3. 自动创建子目录的处理
FbConnection.CreateDatabase本身不支持自动创建不存在的子目录,需要手动处理:
- Windows调试时:调用
.NET的Directory.CreateDirectory()方法,在创建数据库前先建好目标子目录。 - Linux容器部署时:要么在容器启动前预先创建子目录(比如通过Dockerfile添加
RUN mkdir -p /firebird/data/subfolder,或者用启动脚本执行创建命令);要么在应用中通过执行Shell命令(比如mkdir -p)创建容器内的子目录,再调用CreateDatabase。
内容的提问来源于stack exchange,提问作者neggenbe

