学Delphi也好久了,但一直没怎么总结,这不好久没弄ADO了,趁这个星期一直看公司的代码,自己也来实践一下。以前一直用ADO操作单表,一直没怎么弄过ADO操作多表的程序,不自己实践一下还真不知道操作多表时有要注意的地方。下面是一个例子。

第一步,新建一个测试库Test,表结构如下:

第二步,新建一个Delphi应用程序,在界面上放置adoconnection和adoquery以及 datasource和DBGridEh等控件,截图如下:

dfm文件如下:

object Form1: TForm1
  Left = 328
  Top = 78
  Width = 601
  Height = 403
  Caption = '数据库操作'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object tlb1: TToolBar
    Left = 0
    Top = 0
    Width = 585
    Height = 25
    AutoSize = True
    ButtonHeight = 21
    ButtonWidth = 31
    Caption = 'tlb1'
    ShowCaptions = True
    TabOrder = 0
    Transparent = False
    object btnAdd: TToolButton
      Left = 0
      Top = 2
      Caption = '添加'
      ImageIndex = 0
      OnClick = btnAddClick
    end
    object btnDel: TToolButton
      Left = 31
      Top = 2
      Caption = '删除'
      ImageIndex = 1
      OnClick = btnDelClick
    end
    object btnEdit: TToolButton
      Left = 62
      Top = 2
      Caption = '修改'
      ImageIndex = 2
      OnClick = btnEditClick
    end
    object btnSave: TToolButton
      Left = 93
      Top = 2
      Caption = '保存'
      ImageIndex = 3
      OnClick = btnSaveClick
    end
  end
  object dbgrdhUser: TDBGridEh
    Left = 0
    Top = 25
    Width = 585
    Height = 340
    Align = alClient
    DataGrouping.GroupLevels = <>
    DataSource = ds1
    Flat = False
    FooterColor = clWindow
    FooterFont.Charset = DEFAULT_CHARSET
    FooterFont.Color = clWindowText
    FooterFont.Height = -11
    FooterFont.Name = 'MS Sans Serif'
    FooterFont.Style = []
    RowDetailPanel.Color = clBtnFace
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    OnCellClick = dbgrdhUserCellClick
    Columns = <
      item
        EditButtons = <>
        FieldName = 'id'
        Footers = <>
        Visible = False
      end
      item
        EditButtons = <>
        FieldName = 'deptname'
        Footers = <>
        Width = 94
      end
      item
        EditButtons = <>
        FieldName = 'uname'
        Footers = <>
      end
      item
        EditButtons = <>
        FieldName = 'deptid'
        Footers = <>
        Visible = False
      end
      item
        EditButtons = <>
        FieldName = 'sex'
        Footers = <>
        KeyList.Strings = (
          '男'
          '女')
        PickList.Strings = (
          '男'
          '女')
        Width = 45
      end
      item
        EditButtons = <>
        FieldName = 'age'
        Footers = <>
      end
      item
        EditButtons = <>
        FieldName = 'job'
        Footers = <>
      end>
    object RowDetailData: TRowDetailPanelControlEh
    end
  end
  object ds1: TDataSource
    DataSet = ds2
    Left = 208
    Top = 64
  end
  object ds2: TClientDataSet
    Aggregates = <>
    Params = <>
    ProviderName = 'DataSetProvider1'
    Left = 280
    Top = 200
    object intgrfldds2id: TIntegerField
      FieldName = 'id'
      Visible = False
    end
    object strngfldds2deptname: TStringField
      DisplayLabel = '部门名称'
      FieldName = 'deptname'
      LookupDataSet = qryTemp
      KeyFields = 'deptid'
      ProviderFlags = []
    end
    object strngfldds2uname: TStringField
      DisplayLabel = '用户名'
      FieldName = 'uname'
    end
    object intgrfldds2deptid: TIntegerField
      FieldName = 'deptid'
    end
    object strngfldds2set: TStringField
      DisplayLabel = '性别'
      FieldName = 'sex'
      Size = 5
    end
    object intgrfldds2age: TIntegerField
      DisplayLabel = '年龄'
      FieldName = 'age'
    end
    object strngfldds2job: TStringField
      DisplayLabel = '职业'
      FieldName = 'job'
    end
  end
  object DataSetProvider1: TDataSetProvider
    DataSet = qry1
    Left = 208
    Top = 200
  end
  object con: TADOConnection
    LoginPrompt = False
    Left = 176
    Top = 304
  end
  object qry1: TADOQuery
    Connection = con
    Parameters = <>
    Left = 224
    Top = 304
    object intgrfldqry1id: TIntegerField
      FieldName = 'id'
    end
    object strngfldqry1deptname: TStringField
      DisplayLabel = '部门'
      FieldName = 'deptname'
      ProviderFlags = []
    end
    object strngfldqry1uname: TStringField
      DisplayLabel = '姓名'
      FieldName = 'uname'
    end
    object intgrfldqry1deptid: TIntegerField
      DisplayLabel = '部门id'
      FieldName = 'deptid'
    end
    object strngfldqry1sex: TStringField
      DisplayLabel = '性别'
      FieldName = 'sex'
    end
    object intgrfldqry1age: TIntegerField
      DisplayLabel = '年龄'
      FieldName = 'age'
    end
    object strngfldqry1job: TStringField
      DisplayLabel = '职业'
      FieldName = 'job'
    end
  end
  object qryTemp: TADOQuery
    Connection = con
    DataSource = ds1
    Parameters = <>
    Left = 424
    Top = 312
  end
end

第三步,编写简单的增删查改代码代码如下:

unit UnitTblOp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolWin, DBGridEhGrouping, DB, GridsEh, DBGridEh,
  Provider, DBClient, ADODB;

type
  TForm1 = class(TForm)
    tlb1: TToolBar;
    btnAdd: TToolButton;
    btnDel: TToolButton;
    btnEdit: TToolButton;
    btnSave: TToolButton;
    dbgrdhUser: TDBGridEh;
    ds1: TDataSource;
    ds2: TClientDataSet;
    intgrfldds2id: TIntegerField;
    strngfldds2deptname: TStringField;
    strngfldds2uname: TStringField;
    intgrfldds2deptid: TIntegerField;
    strngfldds2set: TStringField;
    intgrfldds2age: TIntegerField;
    strngfldds2job: TStringField;
    DataSetProvider1: TDataSetProvider;
    con: TADOConnection;
    qry1: TADOQuery;
    intgrfldqry1id: TIntegerField;
    strngfldqry1deptname: TStringField;
    strngfldqry1uname: TStringField;
    intgrfldqry1deptid: TIntegerField;
    strngfldqry1sex: TStringField;
    intgrfldqry1age: TIntegerField;
    strngfldqry1job: TStringField;
    qryTemp: TADOQuery;
    procedure FormShow(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure dbgrdhUserCellClick(Column: TColumnEh);
  private
    procedure ShowData;
    procedure FillDept;
  public

end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  strsql='Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s';

procedure TForm1.ShowData;
begin
   with qry1 do
   begin
     Close;
     sql.Clear;
     SQL.Text:='select b.deptname,a.* from tbl_user a left join tbl_dept b on a.deptid=b.deptid';
     Open;
   end;
   ds2.Close;
   ds2.Open;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ShowData;
end;

procedure TForm1.btnAddClick(Sender: TObject);
begin
  ds2.Append;
end;

procedure TForm1.btnDelClick(Sender: TObject);
begin
  if ds2.IsEmpty then exit;
  ds2.Delete;
end;

procedure TForm1.btnEditClick(Sender: TObject);
begin
  ds2.Edit;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
 if ds2.State in [dsInsert,dsEdit] then
 begin
  ds2.Post;
 end;
  ds2.ApplyUpdates(-1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not con.Connected then
  begin
    con.ConnectionString:=Format(strsql,['123456','sa','Test','.']);
    con.Open;
   // FillDept;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if con.Connected then
    con.Close;
end;

procedure TForm1.FillDept;
begin
   with qryTemp do
   begin
     Close;
     SQL.Clear;
     SQL.Add('select *  from  tbl_dept');
     Open;
     First;
     while not eof do
     begin
       dbgrdhUser.FieldColumns['deptname'].PickList.Add(FieldByName('deptname').AsString);
       dbgrdhUser.FieldColumns['deptname'].KeyList.Add(IntToStr(FieldByName('deptid').AsInteger));
       Next;
     end;
   end;
end;

procedure TForm1.dbgrdhUserCellClick(Column: TColumnEh);
var
  index:integer;
begin
 ds2.Edit;
 ds2.FieldByName('deptid').AsInteger:=strtointdef(ds2.FieldByName('deptname').AsString,0);
 ds2.ApplyUpdates(-1);
end;

end.

end.

运行结果如图:

在ADO操作多数据时,默认ADO是要提交多个表相关的语句,因此必须设置数据集字段的providerflags字段,当将pfInput和pfInWhere字段设置为false后,这样就可以只提交单表数据。当没有设置时有可能会出现以下错误:

查看sql分析器原来是生成了以下语句,默认情况当添加修改和删除时,都会对tbl_user表和tbl_dept表生成语句,当没有对tbl_dept赋值时会报上面那个错误 。

解决方法一单表更新即选中数据集控件,然后选中不需要提交的字段,比如该例中是deptname字段,选中该字段然后进行相关属性的设置

  这样进行数据库的操作时只会生成tbl_user相关的sql语句,实现更新单表的目的。

delphi操作数据库相关的知识还有很多细节,需要慢慢研究。欢迎同道中人多多指教。

Delphi中ADO查询多表更新单表解决方法相关推荐

  1. 数据库中的查询语句示例—select单表查询

    宝子们!我们首先要了解SELECT语句的一般格式: SELECT[ALL|DISTINCT]<目标表达式>[,<目标表达式>]...      //DISTINCT:消除重复值 ...

  2. mysql同张表关联多次查询_MySQL多次单表查询和多表联合查询

    Tip:不建议执行三张表以上的多表联合查询 对数据量不大的应用来说,多表联合查询开发高效,但是多表联合查询在表数据量大,并且没有索引的时候,如果进行笛卡儿积,那数据量会非常大,sql执行效率会非常低 ...

  3. jquery submit()不能提交表单的解决方法

    jquery submit()不能提交表单的解决方法 参考文章: (1)jquery submit()不能提交表单的解决方法 (2)https://www.cnblogs.com/war-hzl/p/ ...

  4. Word7中尾部空格不能显示下划线的解决方法

    Word2007中尾部空格不能显示下划线的解决方法    1.  调出"段落"对话框,将"中文版式"->"允许西文在„„换行"打勾.这 ...

  5. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败解决方法

    最近在处理一个项目时使用到了在word中写入信息的功能,由于系统原来就支持在线打印功能,使用了PageOffice,于是就研究了一下PageOffice,发现Pageoffice不能满足自己的功能(或 ...

  6. 更新卡住解决_windows10系统更新卡住的解决方法

    今天小编教你windows10系统更新卡住的解决方法.更新系统是什么呢?系统更新就是指添加新功能及完善现有功能的过程,它可扩展系统功能,解决很多兼容性问题.如果在更新的期间遇到更新过程不动的情况,可参 ...

  7. win11更新特别慢怎么办 windows11更新缓慢的解决方法

    win11作为最新的微软操作系统,现在已经推出了正式版系统下载路径,因此很多电脑硬件达到要求的小伙伴都是在第一时间进行系统更新,可是很多用户在更新时都觉得自己的更新速度及其缓慢,为什么win11更新那 ...

  8. win10更新后应用无法连接服务器,win10更新无法连接到更新服务怎么办_win10无法连接到更新服务的解决方法...

    最近有朋友问小编win10更新无法连接到更新服务怎么办,对于这个问题,相信很多朋友都遇到过,有时候我们想更新自己的win10版本,却发现win10更新无法连接到更新服务,这是怎么回事呢?遇到windo ...

  9. 计算机一打开就卡在更新失败,Win10更新系统卡住不动怎么办 Win10系统更新卡住不动解决方法...

    Win10系统在推出后,微软提供了一年的免费升级服务.旗舰有不少用户选择升级使用,但是期间就有不少用户反应win10的不稳定!但是在后续的更新升级中,也变得更加安全稳定!但是还有一些用户又遇到了问题, ...

最新文章

  1. 【动态规划】炮兵阵地
  2. 用固定收敛标准特征迭代次数法实现分类是不是一个巧合?
  3. 全球首款5G手机来了?三星Galaxy S10 5G版或于4月5日开卖
  4. python 热力图_python高维数据型图表热力图、树形图
  5. jQuery基础总结!!!
  6. cygwin的安装使用
  7. java 485通讯_CAKJ-963U3-KT带485通讯上下限报警智能型仪表
  8. 使用NDK生成native C/C++的可执行程序
  9. 为类型库(Type Library)生成帮助文件
  10. Qt qss 动态属性-不同条件不同显示
  11. 毕业半年,点滴在心中
  12. 蓝牙信标人员定位技术原理分析
  13. 【高阶乐理】即兴演奏——和弦进行的重要原则(现代流行乐)
  14. Mixly第三方用户库开发Arduino UNO使用EMW3080连接阿里云
  15. 天龙八部服务端Lua脚本系统(转)
  16. EPICS教程5 -- areaDetector模块安装
  17. 行人轨迹论文阅读SSAGCN: Social Soft Attention Graph Convolution Network for Pedestrian Trajectory Prediction
  18. 量化投资工具-AKShare是如何进行投资交易的?
  19. 收集的一些新词,之前自己没有看过的。
  20. 解压系统镜像文件img并查看内容

热门文章

  1. 戒烟-这书能让你戒烟pdf
  2. 高楼扔鸡蛋问题-经典动态规划
  3. 男的依然是禽兽,女的却已禽兽不如了
  4. 【智能金融】乐信史红哲:成为分期电商第一股背后的技术战略
  5. 鲲鹏计算展蓝图,无限风光在广东
  6. 2018最新支付系统/第三方支付系统/第四方支付系统/聚合支
  7. 一入魔兽深似海,回首已是中年人
  8. win7 系统增加自定义分辨率_【文献转载】GT5000便携式多参数土壤呼吸测量系统用于棉花田间土壤二氧化碳释放量的测量...
  9. 研发主管的烦恼:选择KPI还是选择OKR?
  10. Oracle把一个表的某个字段更新到另一张表中