为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:Windows
【CPU】:X86
【问题描述】*:使用.Net Core开发应用时,使用了DmBulkCopy,我发现当表中含有Clob类型的字段时,WriteToServer报错,错误是无效的页。无Clob类型字段时,WriteToServer是成功的。
Dm.DmException (0x80004005): 无效的页 at Dm.DmError.ThrowDmException(DmError err) at Dm.DmResp.ThrowServerException(DmMsg msg, String charSet, Boolean rwStandby) at Dm.DmResp.Execute(DmMsg msg, DmStatement stmt, DmConnProperty connProperty) at Dm.DmCsi.ExecutePrepared(DmStatement stmt, DmInfo des) at Dm.DmStatement.ExecutePreparedUpdate() at Dm.DmCommand.ExecutePreparedUpdate() at Dm.DmCommand.do_ExecuteNonQuery() at Dm.DmBulkCopy.insert(Dictionary`2 srcColValueMap) at Dm.DmBulkCopy.WriteToServer(DataTable table)
兄弟 你这个DmBulkCopy是怎么引用的? 有资料么? 我连引用都不行...
碰到和你一样的问题,修改BATCH_PARAM_OPT参数后,现象也是一样,CLOB字段会重复三遍,最后解决了吗?
问题已解决。修改BATCH_PARAM_OPT=1即可。
通过查看源代码,发现BulkCopy最终还是通过ExecuteNonQuery实现的。只不过DmParameter的Value是同样长度的数组。也最终确定了这个“无效的页”是服务器返回的错误,并不是驱动异常。所以我先写了一个测试程序使用ExecuteNonQuery实现了BulkCopy的功能,通过减少每次ExecuteNonQuery提交的行数发现可以提交成功,也就相当于修改BatchSize。
最终确定问题不是因为含有Clob类型字段,而是内容太长导致的。由于Clob字段内容比较长,所以有时候仅仅两行就会提交失败。
通过搜索dm.ini的配置项,发现BATCH_PARAM_OPT配置项,感觉应该有关系,改为1之后重启数据库使其生效,BulkCopy就不报错了。
这个参数的说明:是否启用批量参数优化,0:不启用;1:启用,默认不启用。当置为1时,不返回操作影响的行数。
由于BulkCopy.WriteToServer本来就不返回行数,所以不影响。使用ExecuteNonQuery进行批量提交也可以正常返回影响行数,所以不知道这个参数所说的是影响了什么操作