C#三层SqlDataAdapter.Update实时返回更新条数
时间: 2023-07-12 16:46:10 浏览: 103
在 C# 的三层架构中,SqlDataAdapter.Update() 方法同样不会实时返回更新条数。不过,我们可以在数据访问层(DAL)中使用 RowUpdated 事件来实现实时获取更新条数的需求。
以下是一个简单的示例代码,演示了如何在 DAL 中使用 SqlDataAdapter 的 RowUpdated 事件实时返回更新条数:
```csharp
public class MyDataAccessLayer
{
private SqlConnection connection;
public MyDataAccessLayer(string connectionString)
{
connection = new SqlConnection(connectionString);
}
public int UpdateData(DataTable table)
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.RowUpdated += (sender, args) =>
{
if (args.StatementType == StatementType.Update)
{
Console.WriteLine("{0} rows updated", args.RowsAffected);
}
};
SqlCommand updateCommand = new SqlCommand("UPDATE MyTable SET Column1 = @Column1 WHERE ID = @ID");
updateCommand.Parameters.Add("@Column1", SqlDbType.VarChar, 50, "Column1");
updateCommand.Parameters.Add("@ID", SqlDbType.Int, 4, "ID");
adapter.UpdateCommand = updateCommand;
adapter.SelectCommand = new SqlCommand("SELECT * FROM MyTable", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
return adapter.Update(table);
}
}
```
在这个示例中,我们首先创建了一个 MyDataAccessLayer 类,它包含一个 UpdateData() 方法。在 UpdateData() 方法中,我们创建了一个 SqlDataAdapter 对象,并为它的 RowUpdated 事件添加了一个处理程序。在处理程序中,我们判断当前更新操作的 StatementType 是否为 Update,如果是,则输出当前更新操作所影响的行数。
接着,我们创建了一个 SqlCommand 对象,用于执行 UPDATE 操作,并将它关联到 SqlDataAdapter 的 UpdateCommand 属性上。我们还设置了 SqlDataAdapter 的 SelectCommand 属性,用于执行 SELECT 操作。最后,我们通过 SqlCommandBuilder 自动生成 INSERT、UPDATE 和 DELETE 命令,并调用 SqlDataAdapter 的 Update() 方法执行更新操作。Update() 方法返回的是总的更新条数。
需要注意的是,以上代码只是一个简单的示例,实际情况可能更为复杂。例如,可能需要处理并发更新冲突等问题。同时,为了更好地实现三层架构的分离,建议将 DAL 中的 SqlDataAdapter 替换为更为灵活的 ORM 框架,例如 Entity Framework、NHibernate 等。
阅读全文