ADO.NET中替代Classic ADO.Recordset的通用读写方案咨询
通用数据读写实现方案
针对你需要的控件名与字段名匹配的通用读写功能,可以封装两个核心方法,无需针对特定表单或表编写重复代码:
1. 从DataTable读取数据到控件
' 通用读取方法:将DataTable的当前行数据匹配到对应控件 Sub LoadDataToControls(dt As DataTable, ctrlContainer As Control) If dt.Rows.Count = 0 Then Return Dim currentRow As DataRow = dt.Rows(0) ' 假设取第一行,可根据需求调整为当前编辑行 For Each ctrl As Control In ctrlContainer.Controls ' 匹配字段名与控件名,赋值(支持TextBox、ComboBox等常用控件) If dt.Columns.Contains(ctrl.Name) Then Select Case ctrl.GetType().Name Case "TextBox" DirectCast(ctrl, TextBox).Text = If(currentRow(ctrl.Name) Is DBNull.Value, "", currentRow(ctrl.Name).ToString()) Case "ComboBox" Dim cbo As ComboBox = DirectCast(ctrl, ComboBox) cbo.Text = If(currentRow(ctrl.Name) Is DBNull.Value, "", currentRow(ctrl.Name).ToString()) Case "CheckBox" DirectCast(ctrl, CheckBox).Checked = If(currentRow(ctrl.Name) Is DBNull.Value, False, CBool(currentRow(ctrl.Name))) ' 可扩展其他控件类型(如DateTimePicker等) End Select End If Next End Sub
2. 将控件值写回数据库(新增/编辑通用)
利用OleDbCommandBuilder自动生成SQL命令,无需手动编写Update/Insert语句:
' 通用写入方法:根据控件值更新或新增DataTable行,同步到数据库 Sub SaveControlsToDatabase(dt As DataTable, ctrlContainer As Control, adapter As OleDbDataAdapter, connectionString As String) Dim rowToEdit As DataRow = Nothing ' 判断是新增还是编辑:如果DataTable有行则编辑第一行,否则新增 If dt.Rows.Count > 0 Then rowToEdit = dt.Rows(0) Else rowToEdit = dt.NewRow() dt.Rows.Add(rowToEdit) End If ' 将控件值匹配到DataRow字段 For Each ctrl As Control In ctrlContainer.Controls If dt.Columns.Contains(ctrl.Name) Then Select Case ctrl.GetType().Name Case "TextBox" rowToEdit(ctrl.Name) = If(String.IsNullOrEmpty(DirectCast(ctrl, TextBox).Text), DBNull.Value, DirectCast(ctrl, TextBox).Text) Case "ComboBox" rowToEdit(ctrl.Name) = If(String.IsNullOrEmpty(DirectCast(ctrl, ComboBox).Text), DBNull.Value, DirectCast(ctrl, ComboBox).Text) Case "CheckBox" rowToEdit(ctrl.Name) = DirectCast(ctrl, CheckBox).Checked ' 扩展其他控件类型 End Select End If Next ' 自动生成SQL命令并同步到数据库 Dim builder As New OleDbCommandBuilder(adapter) adapter.Update(dt) End Sub
使用示例
在表单中调用:
' 初始化DataTable和Adapter(可封装到通用数据操作类) Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=YourAccessDB.accdb;" Dim adapter As New OleDbDataAdapter("SELECT * FROM YourTable", connStr) Dim dt As New DataTable() adapter.Fill(dt) ' 读取数据到控件 LoadDataToControls(dt, Me) ' 修改控件值后保存 SaveControlsToDatabase(dt, Me, adapter, connStr)
ADO.NET 是否是 Classic ADO 的进阶版本?
不是简单的“进阶”,两者是基于不同设计理念的产物:
- Classic ADO是连接式模型:始终保持与数据库的连接,Recordset兼具读取、更新功能,适合小型单用户应用,操作简单但扩展性差,无法适配分布式场景。
- ADO.NET是断开式模型:数据读取后断开连接,DataSet/DataTable在本地缓存数据,适合多用户、分布式应用,虽然初期编码复杂度高,但可维护性、扩展性更强。
对于你的小型Access应用,ADO.NET的断开式模型可能显得繁琐,但封装通用方法后,同样能实现类似Classic ADO的便捷操作,且更符合.NET生态的设计规范。
内容的提问来源于stack exchange,提问作者Hemu
相关产品推荐
相关产品推荐

