开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 196|回复: 12
收起左侧

[已解决] 保存到XML 失败的问题

 关闭 [复制链接]
结帖率:100% (39/39)
发表于 2025-7-5 10:09:17 | 显示全部楼层 |阅读模式   广东省深圳市
50精币
UPS记录集.1打开 (“select * from test where id='1'”, #SQL语句, )
sql = 记录集1.保存到XML (取运行目录 () + “\temp\sqlSwap.xml”)UPS记录集1.关闭 ()

第一次保存成功,但第二次再运行代码保存就会失败。
尝试过删除文件也能正常删除成功(测试文件是否被占用,能删除所以没被占用),再保存还是失败。
用了随机数文件名,每次都会成功,这是啥原理咋解决





最佳答案

查看完整内容

在易语言中使用记录集保存XML时出现“首次成功、后续失败”的问题,核心原因通常是**记录集状态未重置**或**文件操作残留锁定**。以下是具体分析和解决方案:### 问题原因分析1. **记录集状态残留** 第一次保存后,`记录集1`可能处于“已定位到末尾”“只读状态”或内部缓存未清空的状态,第二次使用同一记录集时,`保存到XML`方法会因状态异常失败。2. **文件系统延迟** 虽然删除文件显示成功,但Windows文件系统可能存在 ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:57% (12/21)

签到天数: 6 天

发表于 2025-7-5 10:09:18 | 显示全部楼层   浙江省湖州市
在易语言中使用记录集保存XML时出现“首次成功、后续失败”的问题,核心原因通常是**记录集状态未重置**或**文件操作残留锁定**。以下是具体分析和解决方案:### 问题原因分析1. **记录集状态残留**     第一次保存后,`记录集1`可能处于“已定位到末尾”“只读状态”或内部缓存未清空的状态,第二次使用同一记录集时,`保存到XML`方法会因状态异常失败。2. **文件系统延迟**     虽然删除文件显示成功,但Windows文件系统可能存在延迟(尤其是机械硬盘),导致第二次创建文件时实际路径仍被短暂锁定,引发写入失败。3. **XML格式冲突**     第一次保存的XML文件可能残留特殊格式(如BOM头、未闭合标签),第二次写入时因格式校验失败导致保存失败(随机文件名因无历史文件,故不触发此问题)。### 解决方案:彻底重置流程通过“重新初始化记录集+强制文件预处理”确保每次保存都是全新状态,代码如下:```易语言.版本 2.支持库 eDB.支持库 spec.子程序 保存记录集到XML, 逻辑型.参数 保存路径, 文本型.局部变量 记录集, 整数型.局部变量 预处理成功, 逻辑型    // 1. 强制预处理文件(确保路径可用)    预处理成功 = 预处理保存路径 (保存路径)    如果 (预处理成功 = 假)        调试输出 ("保存失败:文件预处理失败,路径=" + 保存路径)        返回 (假)    结束        // 2. 重新创建记录集(每次都用新实例,避免状态残留)    记录集 = 数据库连接1.打开记录集 (“select * from test where id='1'”, #SQL语句, )    如果 (记录集 = 0)        调试输出 ("保存失败:记录集打开失败")        返回 (假)    结束        // 3. 保存XML(使用新记录集)    如果 (记录集.保存到XML (保存路径) = 假)        调试输出 ("保存失败:XML写入失败,路径=" + 保存路径)        记录集.关闭 ()        返回 (假)    结束        // 4. 彻底关闭记录集,释放资源    记录集.关闭 ()    记录集 = 0  // 显式置空,避免状态残留        调试输出 ("保存成功:" + 保存路径)    返回 (真).子程序尾.子程序 预处理保存路径, 逻辑型.参数 目标路径, 文本型.局部变量 目录路径, 文本型.局部变量 重试次数, 整数型    // 确保目录存在    目录路径 = 取文本左边 (目标路径, 倒找文本 (目标路径, “\”, , 真))    如果 (目录是否存在 (目录路径) = 假)        如果 (创建目录 (目录路径) = 假)            返回 (假)        结束    结束        // 强制删除已有文件(解决残留锁定)    如果 (文件是否存在 (目标路径))        // 重试3次,解决文件系统延迟        重试次数 = 0        循环判断 (重试次数 < 3)            如果 (删除文件 (目标路径))                跳出循环            结束            重试次数 = 重试次数 + 1            延时 (100)  // 等待100ms让系统释放文件        循环判断尾 ()        如果 (重试次数 = 3)            调试输出 ("预处理失败:文件删除重试超限,路径=" + 目标路径)            返回 (假)        结束    结束        // 再次确认文件已删除    如果 (文件是否存在 (目标路径))        返回 (假)    结束        返回 (真).子程序尾```### 调用示例```易语言.版本 2.子程序 _按钮_保存XML_被单击.局部变量 保存路径, 文本型    // 固定路径(即使使用固定路径也能稳定运行)    保存路径 = 取运行目录 () + “\temp\sqlSwap.xml”        // 调用优化后的保存流程    如果 (保存记录集到XML (保存路径))        信息框 (“保存成功”, 0, )    否则        信息框 (“保存失败”, 0, )    结束```### 核心优化点1. **记录集全新实例化**     每次保存都通过`数据库连接1.打开记录集`创建新的记录集实例,避免第一次保存后的状态残留(如游标位置、缓存数据)。2. **文件强制预处理**     - 先删除目标文件并重试3次(解决文件系统延迟)     - 确认文件彻底删除后再创建新文件,避免“删除成功但实际未释放”的隐性锁定。3. **显式释放资源**     保存后立即`关闭记录集`并置空(`记录集 = 0`),确保内存中无残留状态。### 额外注意事项- 如果使用的是“UPS记录集”(第三方数据库组件),需确保组件支持“重复打开-保存”操作,部分旧组件存在单例限制。- 检查`\temp\`目录权限,确保程序有“创建/删除/写入”权限(尤其是非管理员运行时)。- 若仍有问题,可在`保存到XML`前添加`整理内存 ()`,释放可能的内存碎片导致的资源冲突。通过以上方法,即使使用固定文件名,也能稳定重复保存XML文件,解决“首次成功、后续失败”的问题。


  
子程序名返回值类型公开备 注
保存记录集到XML逻辑型 
参数名类 型参考可空数组备 注
保存路径文本型
变量名类 型静态数组备 注
记录集整数型 
预处理成功逻辑型 
// 1. 强制预处理文件(确保路径可用)
预处理成功 = 预处理保存路径 (保存路径)
如果 (预处理成功 = )
调试输出 ("保存失败:文件预处理失败,路径=" + 保存路径)
返回 ()
结束

// 2. 重新创建记录集(每次都用新实例,避免状态残留)
记录集 = 数据库连接1.打开记录集 (“select * from test where id='1'”, #SQL语句, )
如果 (记录集 = 0)
调试输出 ("保存失败:记录集打开失败")
返回 ()
结束

// 3. 保存XML(使用新记录集)
如果 (记录集.保存到XML (保存路径))
调试输出 ("保存失败:XML写入失败,路径=" + 保存路径)
记录集.关闭 ()
返回 ()
结束

// 4. 彻底关闭记录集,释放资源
记录集.关闭 ()
记录集 = 0  // 显式置空,避免状态残留

调试输出 ("保存成功:" + 保存路径)
返回 ()
.子程序尾
子程序名返回值类型公开备 注
预处理保存路径逻辑型 
参数名类 型参考可空数组备 注
目标路径文本型
变量名类 型静态数组备 注
目录路径文本型 
重试次数整数型 
// 确保目录存在
目录路径 = 取文本左边 (目标路径, 倒找文本 (目标路径, “\”, , ))
如果 (目录是否存在 (目录路径))
如果 (创建目录 (目录路径))
返回 ()
结束
结束

// 强制删除已有文件(解决残留锁定)
如果 (文件是否存在 (目标路径))
// 重试3次,解决文件系统延迟
重试次数 = 0
循环判断 (重试次数 < 3)
如果 (删除文件 (目标路径))
跳出循环
结束
重试次数 = 重试次数 + 1
延时 (100)  // 等待100ms让系统释放文件
循环判断尾 ()
如果 (重试次数 = 3)
调试输出 ("预处理失败:文件删除重试超限,路径=" + 目标路径)
返回 ()
结束
结束

// 再次确认文件已删除
如果 (文件是否存在 (目标路径))
返回 ()
结束

返回 ()
.子程序尾


i支持库列表   支持库注释   
eDB数据库操作支持库
spec特殊功能支持库

  
子程序名返回值类型公开备 注
_按钮_保存XML_被单击  
变量名类 型静态数组备 注
保存路径文本型 
// 固定路径(即使使用固定路径也能稳定运行)
保存路径 = 取运行目录 ()“\temp\sqlSwap.xml”

// 调用优化后的保存流程
如果 (保存记录集到XML (保存路径))
信息框 (“保存成功”, 0, )
否则
信息框 (“保存失败”, 0, )
结束

回复

使用道具 举报

签到天数: 16 天

发表于 2025-7-5 10:30:54 | 显示全部楼层   河南省驻马店市
即使显示文件未被占用,系统可能在储存的时候是占用的。

试试吧资源释放掉。


UPS记录集.1打开 (“select * from test where id='1'”, #SQL语句, )
sql = 记录集1.保存到XML (取运行目录 () + “\temp\sqlSwap.xml”)
UPS记录集1.关闭 ()
处理事件 ()
延迟 (500)  
回复

使用道具 举报

结帖率:100% (39/39)

签到天数: 10 天

 楼主| 发表于 2025-7-5 10:42:23 | 显示全部楼层   广东省深圳市
laihobglei 发表于 2025-7-5 10:30
即使显示文件未被占用,系统可能在储存的时候是占用的。

试试吧资源释放掉。

还是不行
回复

使用道具 举报

签到天数: 16 天

发表于 2025-7-5 10:49:28 | 显示全部楼层   河南省驻马店市
.版本 2
.支持库 eDB

.如果真 (文件是否存在 (取运行目录 () + “\temp\sqlSwap.xml”))
    移动文件 (取运行目录 () + “\temp\sqlSwap.xml”, 取运行目录 () + “\temp\sqlSwap_old.xml”)
.如果真结束
试试使用内存流中转

UPS记录集1.打开 (“select * from test where id='1'”, #SQL语句, )
sql = 记录集1.保存到XML (取运行目录 () + "\temp\sqlSwap.xml")

UPS记录集1.关闭 ()
回复

使用道具 举报

结帖率:100% (39/39)

签到天数: 10 天

 楼主| 发表于 2025-7-5 10:54:36 | 显示全部楼层   广东省深圳市
laihobglei 发表于 2025-7-5 10:49
.版本 2
.支持库 eDB

也不行,第二次再保存XML还是会失败

sql = 连接.UPS记录集.保存到XML (取运行目录 () + “\temp\sqlSwap.xml”)
连接.UPS记录集.关闭 ()

.如果真 (文件是否存在 (取运行目录 () + “\temp\sqlSwap.xml”))
    移动文件 (取运行目录 () + “\temp\sqlSwap.xml”, 取运行目录 () + “\temp\sqlSwap_old.xml”)
.如果真结束

调试输出 (sql, “保存持久文件”)
回复

使用道具 举报

结帖率:100% (39/39)

签到天数: 10 天

 楼主| 发表于 2025-7-5 10:55:47 | 显示全部楼层   广东省深圳市
laihobglei 发表于 2025-7-5 10:49
.版本 2
.支持库 eDB

换个文件名就会成功,但是这样不安全,而且也会增加不必要的流程
回复

使用道具 举报

签到天数: 16 天

发表于 2025-7-5 11:02:59 | 显示全部楼层   河南省驻马店市
试试解锁下文件。实在不行我也没办法了。

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
UPS记录集.1打开 (“select * from test where id='1'”, #SQL语句, )
强制解锁文件 ()
sql = 记录集1.保存到XML (取运行目录 ()“\temp\sqlSwap.xml”)
UPS记录集1.关闭 ()
子程序名返回值类型公开备 注
强制解锁文件  
变量名类 型静态数组备 注
句柄整数型 
句柄 = 打开文件 (取运行目录 ()“\temp\sqlSwap.xml”, #读写, )
如果真 (句柄 ≠ 0)
解除文件锁 (句柄)


  
DLL命令名返回值类型公开备 注
解除文件锁逻辑型 
DLL库文件名:
kernel32.dll
在DLL库中对应命令名:
CloseHandle
参数名类 型传址数组备 注
文件句柄整数型


回复

使用道具 举报

结帖率:100% (39/39)

签到天数: 10 天

 楼主| 发表于 2025-7-5 12:12:21 | 显示全部楼层   广东省深圳市
保存到XML 失败的时候,用写到文件能把数据写进去。。。。这是记录集组件BUG问题吗?
回复

使用道具 举报

结帖率:0% (0/1)

签到天数: 17 天

发表于 2025-7-5 16:33:48 | 显示全部楼层   福建省福州市
能删除成功,第二次不能保存?无代码没办法排查,太久没用,不知道只读文件会不会影响写入。看一下文件是否是只读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表