使用.NET EF6插入Informix数据时遇‘no such DBspace’错误求助
最近我遇到个头疼的问题:用.NET Entity Framework 6.1.3往标注为"DB2 v10.5.700.375 Fix Pack 7"的Informix数据库执行插入操作时,直接触发了这个错误:
ERROR [IX000] [IBM][IDS/NT64] Invalid default sbspace name (sbspace). (-130 ISAM error: no such DBspace)
我查了相关技术资料后,先执行了onstat -d命令查看数据库空间情况,输出如下:
C:\Program Files\Informix>onstat -d IBM Informix Dynamic Server Version 12.10.FC9DE -- On-Line -- Up 1 days 22:26:52 -- 185088 Kbytes Dbspaces address number flags fchunk nchunks pgsize flags owner name 0000000080CD5030 1 0x30001 1 1 4096 N BA informix rootdbs 1 active, 2047 maximum Chunks address chunk/dbs offset size free bpages flags pathname 0000000080CD5280 1 1 0 216064 91351 PO-B-D C:\PROGRA~1\Informix\storage\rootdbs.000 1 active, 32766 maximum
注意:DBspace块的"size"和"free"列数值以所属DBspace的"pgsize"为单位显示。
问题根源
从onstat -d的输出能明显看出来:当前数据库只有一个名为rootdbs的系统空间,完全没有Informix默认期望的sbspace智能大对象空间。当EF插入的数据里包含大对象类型(比如TEXT、BYTE,或者EF映射的对应.NET类型)时,Informix会自动尝试把这些大对象存到默认的sbspace里,找不到这个空间就会抛出上述错误。
可行的解决方案
我整理了几个靠谱的解决办法,你可以根据自己的场景选择:
方案一:创建默认的sbspace
这是最标准的解决方式,专门为大对象开辟独立的存储空间:- 先在Informix的存储目录下准备好空的空间文件,比如
C:\PROGRA~1\Informix\storage\sbspace.000 - 用
onspaces命令创建sbspace(注意要以Informix管理员权限执行):
这里onspaces -c -S sbspace -p C:\PROGRA~1\Informix\storage\sbspace.000 -s 1048576-s参数是空间大小,单位是KB,示例里设的是1GB,你可以根据实际业务需求调整。 - 创建完成后再跑一遍
onstat -d,确认sbspace已经出现在Dbspaces列表里,之后再执行插入操作就正常了。
- 先在Informix的存储目录下准备好空的空间文件,比如
方案二:修改表结构,指定大对象存储到现有空间
如果不想新增sbspace,可以直接修改包含大对象字段的表,指定这些字段存到已有的rootdbs里:-- 修改已有表的大对象字段存储位置 ALTER TABLE 你的表名 MODIFY 大对象字段名 TEXT IN rootdbs; -- 或者新建表时直接指定 CREATE TABLE 你的表名 ( id INT, content TEXT IN rootdbs );方案三:调整Informix默认sbspace配置(不推荐)
可以修改Informix的onconfig配置文件,把SBSPACENAME参数改成现有的rootdbs,然后重启Informix服务。不过这种方式不建议,因为rootdbs是系统核心空间,存大对象可能会影响数据库的性能和稳定性。
注意事项
不管选哪种方案,操作前最好先备份数据库;创建空间的时候要确保目标磁盘有足够的空闲空间,避免操作失败。
内容的提问来源于stack exchange,提问作者Paceman

