【发布时间】:2025-12-23 07:40:11
【问题描述】:
我正在尝试将一些旧的 VB6 代码移植到 C# 和 .NET。
在很多地方,旧代码使用RecordSet 来执行 SQL 查询,然后循环遍历结果。到目前为止没问题,但是在循环内部,代码会更改当前行,更新列,甚至完全删除当前行。
在 .NET 中,我可以轻松地使用 SqlDataReader 循环访问 SQL 查询结果,但不支持更新。
所以我一直在使用SqlDataAdapter 填充DataSet,然后循环遍历DataSet 表中的行。但是与 VB6 的旧 RecordSet 相比,DataSet 似乎不太聪明。一方面,我需要为我拥有的每种编辑类型提供更新查询。另一个问题是DataSet 似乎一次将所有内容都保存在内存中,如果有很多结果,这可能是个问题。
在 .NET 中复制此行为的最佳方法是什么?下面的代码显示了我到目前为止所拥有的。这是最好的方法,还是有其他选择?
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet dataset = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(new SqlCommand(query, connection)))
{
adapter.Fill(dataset);
DataTable table = dataset.Tables[0];
foreach (DataRow row in table.Rows)
{
if ((int)row["Id"] == 4)
{
if ((int)row["Value1"] > 0)
row["Value2"] = 12345;
else
row["Value3"] = 12345;
}
else if ((int)row["Id"] == 5)
{
row.Delete();
}
}
// TODO:
adapter.UpdateCommand = new SqlCommand("?", connection);
adapter.DeleteCommand = new SqlCommand("?", connection);
adapter.Update(table);
}
}
注意:我是公司的新手,不能很好地告诉他们必须更改连接字符串或必须切换到实体框架,这将是我的选择。我真的在寻找纯代码解决方案。
【问题讨论】:
-
您使用的是什么数据库?如果您使用的是 Sql Server,您只需 enable Multiple Active Result Sets
-
@Steve:SQL Server,但我原以为这是由 ADO.NET 决定的。
-
如上,只需在连接字符串中使用Multiple Active Result Sets
-
嗯,我是公司的新手,无法告诉他们必须使用什么连接。此外,即使使用该设置,我也无法像旧代码那样更新当前行。我必须运行单独的查询。
-
是的,您需要执行单独的查询。 MARS 只允许您使用相同的连接和两个不同的操作。另一种可能性是打开第二个连接来更新行,但您仍然需要执行单独的查询。
标签: c# .net vb6 ado.net sqldataadapter