none
如何在不使用OleDbCommandBuilder情况下使用OleDbDataAdapter更新Access数据库记录 RRS feed

  • 问题

  • 各位好!

    本人最近在学习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="直接更新&#xD;&#xA;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="使用&#xD;&#xA;OleDbDataAdapter&#xD;&#xA;更新(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 再次明确需求
    2020年3月15日 2:02

答案

  • 可能我的问题太简单,并没有获得太多解答。

    到今天为止,我自己通过查找和摸索,基本把这个问题解决了,还是记录下来,供其他朋友参考。

    详细解答我写在了博客园的随笔中,随笔:请点击查看


    • 已标记为答案 wxysy 2020年3月24日 15:48
    • 已编辑 wxysy 2020年3月24日 15:53 完善
    2020年3月24日 15:48