You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:36:06