积极答复者
如何在不使用OleDbCommandBuilder情况下使用OleDbDataAdapter更新Access数据库记录

问题
-
各位好!
本人最近在学习Access数据库。在尝试使用C#语言在WPF项目内进行Access数据库的连接与记录修改。
网上有很多文章将此方面内容,但都是OleDbCommandBuilder和OleDbDataAdapter联合使用,好处很多,但弊端显而易见:一旦查询为基于多表的联合查询,若要修改记录,OleDbCommandBuilder便不可使用。
直接使用OleDbCommand进行操作,本人已经摸索明白。但如何在不使用OleDbCommandBuilder情况下使用OleDbDataAdapter更新Access数据库记录,本人才疏学浅,实在是搞不懂,还请指点。
本人的需求很简单:
1、单独使用OleDbDataAdapter类(不使用OleDbCommandBuilder)
2、使用OleDbDataAdapter类的Update方法,更新所有在datagrid控件内修改了公司名称的数据库记录(改什么公司名称随意)。
以下为相关辅助信息:
一、Access数据库结构
Access的J-Sql查询语句:
SELECT T0101_公司情况表.公司名称_PK, T0101_公司情况表.统一社会信用代码, T0301_fdc证件信息表.证件编号
FROM T0101_公司情况表 INNER JOIN T0301_fdc证件信息表 ON T0101_公司情况表.公司名称_PK = T0301_fdc证件信息表.公司名称_FK;
二、WPF页面布局
前端代码:
<Window x:Class="WpfAccess_2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfAccess_2" mc:Ignorable="d" Title="MainWindow" Height="657.812" Width="1276.562"> <Grid> <DataGrid x:Name="dataGrid" Margin="10,198,10,10" AutoGenerateColumns="True"/> <Button x:Name="btn_Read" Content="读取" HorizontalAlignment="Left" VerticalAlignment="Top" Width="212" Margin="10,10,0,0" Height="66" FontSize="20" Click="Btn_Read_Click"/> <Button x:Name="btn_Update" Content="直接更新
Update" HorizontalAlignment="Left" Margin="227,10,0,0" VerticalAlignment="Top" Width="212" Height="66" FontSize="20" Click="Btn_Update_Click"/> <Button x:Name="btn_Clear" Content="清除" HorizontalAlignment="Left" Margin="10,81,0,0" VerticalAlignment="Top" Width="212" Height="66" Click="Btn_Clear_Click" FontSize="20"/> <Button x:Name="btn_Update2" Content="使用
OleDbDataAdapter
更新(Update2)" HorizontalAlignment="Left" Margin="227,81,0,0" VerticalAlignment="Top" Width="212" Height="82" Click="Btn_Update2" FontSize="20"/> </Grid> </Window>
三、后端C#代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data.OleDb; using System.Data; namespace WpfAccess_2 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); InitializeMyComponent(); } OleDbConnection connection; OleDbDataAdapter dataAdapter; DataTable dataTable; private void InitializeMyComponent() { connection = new OleDbConnection() { ConnectionString = Properties.Settings.Default.myConnectString //myConnectString为存放的连接字符串 }; string selectCommand = "SELECT T0101_公司情况表.公司名称_PK, T0101_公司情况表.统一社会信用代码, T0301_fdc证件信息表.证件编号 FROM T0101_公司情况表 INNER JOIN T0301_fdc证件信息表 ON T0101_公司情况表.公司名称_PK = T0301_fdc证件信息表.公司名称_FK"; dataAdapter = new OleDbDataAdapter(selectCommand, connection); dataTable = new DataTable(); } private void Btn_Read_Click(object sender, RoutedEventArgs e) { dataTable.Clear(); dataAdapter.Fill(dataTable); dataGrid.ItemsSource = dataTable.DefaultView;//这句话好像只能放这里,否则显示不正常。 } private void Btn_Update_Click(object sender, RoutedEventArgs e) { //使用OleDbCommand //OleDbCommandBuilder()只能针对单个表用,使用有限制。 OleDbCommand oleDbCommand = new OleDbCommand() { CommandText = "UPDATE T0101_公司情况表 SET 公司名称_PK = @查询参数1 WHERE 统一社会信用代码 = '91420300063507079P'", Connection=connection,//使用“统一社会信用代码”定位特定数据库记录,目前只会这么做。 }; OleDbParameter parameter = new OleDbParameter("@查询参数1", OleDbType.VarChar, 50, "公司名称_PK"); Random random = new Random(2); parameter.Value = "测试公司名称" + random.Next(1, 999);//让名字每次不一样 oleDbCommand.Parameters.Add(parameter); connection.Open(); oleDbCommand.ExecuteNonQuery(); connection.Close(); dataTable.Clear(); dataAdapter.Fill(dataTable); } private void Btn_Clear_Click(object sender, RoutedEventArgs e) { dataTable.Clear(); } private void Btn_Update2(object sender, RoutedEventArgs e) { //使用OleDbDataAdapter的Update方法,不知道 } } }
- 已编辑 wxysy 2020年3月16日 2:26 再次明确需求