更新或删除当前的数据库结果行

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,这将是我的选择.我真的在寻找一个仅限代码的解决方案.

Iva*_*oev 6

ADO.NET DataTableDataAdapter提供ADO的最接近的等效Recordset与适用concens原则的分离.DataTable包含数据并提供更改跟踪信息(类似于EF内部实体跟踪),同时DataAdapter提供从数据库(Fill方法)填充它并将更改应用回数据库(Update方法)的标准方法.

话虽如此,你在做什么是将ADO移植Recordset到ADO.NET 的预期方法.你错过的唯一的事情是,你并不总是需要指定Insert,UpdateDelete命令.一旦您的查询查询单个表(我认为Recordset无论如何都需要更新),您可以使用另一个名为的ADO.NET播放器DbCommandBuilder:

自动生成单表命令,用于协调对a DataSet与关联数据库所做的更改.

每个数据库提供程序都提供此抽象类的实现.SqlCommandBuilderMSDN示例几乎与您的示例相同,因此在调用之前您需要的Update只是(有点违反直觉):

var builder = new SqlCommandBuilder(adapter); 
Run Code Online (Sandbox Code Playgroud)

就是这样.

在幕后,

DbCommandBuilder寄存器本身作为侦听RowUpdating由在此属性中指定的DbDataAdapter的生成的事件.

如果没有在数据适配器中专门设置这些命令,则动态生成这些命令.