Access VBA旧应用升级C#,寻找等效Do While Not RS.EOF的记录集遍历方法生成XML
功能对应说明
C#中完全存在和Do While Not RS.EOF等价的遍历逻辑,根据你读取数据库的方式不同,有两种主流实现方案:
方案1:使用DbDataReader(和VBA Recordset逻辑最接近)
DbDataReader是向前只读的流式数据读取器,和你原来用的Access Recordset行为高度一致:
reader.Read()方法等价于 VBA里的RS.MoveNext+ 隐式判断EOF:返回true表示还有下一条数据,返回false表示已经读到末尾,完全对应Not RS.EOF的判断条件
代码示例(对接Access数据库用OleDb驱动):
using System.Data.OleDb; // 替换为你的实际数据库连接字符串 string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\你的Access数据库路径.accdb;Persist Security Info=False;"; // 推荐用参数化查询,避免SQL注入,不要直接拼接SQL字符串 string sql = "SELECT * FROM TTable WHERE ID = ?"; using (OleDbConnection conn = new OleDbConnection(connString)) using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { // 替换为你实际传入的ID值,对应原来的Forms![test]![SifraFirme] cmd.Parameters.AddWithValue("@ID", 你要查询的ID值); conn.Open(); // 等价于原来的Db.OpenRecordset操作 using (OleDbDataReader reader = cmd.ExecuteReader()) { // 这个循环就完全等价于你原来的 Do While Not RS2.EOF 循环 while (reader.Read()) { // 在这里写你原来的业务逻辑,读取字段示例: // 字符串类型:string fieldValue = reader.GetString(reader.GetOrdinal("字段名")); // 整型:int id = reader.GetInt32(reader.GetOrdinal("ID")); // 写入XML的逻辑放在此处即可 } } }
方案2:填充到DataTable遍历
如果你需要一次性把所有数据加载到内存再处理,可以用DataAdapter填充DataTable,直接遍历行集合即可:
using System.Data; using System.Data.OleDb; string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\你的Access数据库路径.accdb;"; string sql = "SELECT * FROM TTable WHERE ID = ?"; DataTable dt = new DataTable(); using (OleDbConnection conn = new OleDbConnection(connString)) using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { cmd.Parameters.AddWithValue("@ID", 你要查询的ID值); conn.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); adapter.Fill(dt); } // 遍历DataTable的所有行,等价于原来的Recordset遍历 foreach (DataRow row in dt.Rows) { // 读取字段示例:string fieldValue = row["字段名"].ToString(); // 你的业务逻辑和XML写入逻辑放在这里 }
补充注意点
- 如果你后续把数据库迁移到SQL Server等其他数据库,只需要把
OleDb前缀的类换成对应数据库驱动的类即可,核心遍历逻辑完全不变 - 强烈建议不要直接拼接SQL字符串,使用参数化查询可以避免SQL注入风险,也能避免特殊字符导致的SQL语法错误
- 写入XML的需求可以用.NET内置的
XDocument或者XmlWriter类实现,语法更简洁,也支持LINQ to XML快速构造符合结构的XML文件
内容的提问来源于stack exchange,提问作者EmirSuvalic
相关产品推荐
相关产品推荐

