Jon*_*ood 3 .net c# vb6 ado.net sqldataadapter
我正在尝试将一些旧的VB6代码移植到C#和.NET.
旧代码使用a RecordSet来执行SQL查询然后遍历结果.到目前为止没问题,但在循环内部代码对当前行进行更改,更新列甚至完全删除当前行.
在.NET中,我可以轻松地使用a SqlDataReader循环遍历SQL查询结果,但不支持更新.
所以我一直在使用a SqlDataAdapter来填充a DataSet,然后循环遍历DataSet表中的行.但DataSet与VB6相比,它看起来并不聪明RecordSet.首先,我需要为每种类型的编辑提供更新查询.另一个问题是,a 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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我是公司的新手,不能很好地告诉他们必须更改连接字符串或必须切换到Entity Framework,这将是我的选择.我真的在寻找一个仅限代码的解决方案.
ADO.NET DataTable和DataAdapter提供ADO的最接近的等效Recordset与适用concens原则的分离.DataTable包含数据并提供更改跟踪信息(类似于EF内部实体跟踪),同时DataAdapter提供从数据库(Fill方法)填充它并将更改应用回数据库(Update方法)的标准方法.
话虽如此,你在做什么是将ADO移植Recordset到ADO.NET 的预期方法.你错过的唯一的事情是,你并不总是需要指定Insert,Update并Delete命令.一旦您的查询查询单个表(我认为Recordset无论如何都需要更新),您可以使用另一个名为的ADO.NET播放器DbCommandBuilder:
自动生成单表命令,用于协调对a
DataSet与关联数据库所做的更改.
每个数据库提供程序都提供此抽象类的实现.SqlCommandBuilder的MSDN示例几乎与您的示例相同,因此在调用之前您需要的Update只是(有点违反直觉):
var builder = new SqlCommandBuilder(adapter);
Run Code Online (Sandbox Code Playgroud)
就是这样.
在幕后,
该
DbCommandBuilder寄存器本身作为侦听RowUpdating由在此属性中指定的DbDataAdapter的生成的事件.
如果没有在数据适配器中专门设置这些命令,则动态生成这些命令.