FireDAC 同一个查询语句中有join, 同时更新多个数据表设置

dfdquery.sql.text := 'select a.*, b.* from a left join b on a.id = b.id

fdqery.cacheupdate := true;  //这样可更方便回退多表错误

fdquery.updateoptions.updatenobasefields := true; //副表字段可以编辑 

fdquery.updateobject := TFdUpdateSqL; 或者fdquery.onupdaterecord事件。

以下是一个示例:

procedure TForm2.Button3Click(Sender: TObject);
varne:Integer;
beginqrym.CheckBrowseMode;if not qrym.UpdatesPending thenExit;qrym.UpdateObject := FDUpdateSQL1;ne := qrym.ApplyUpdates(0);qrym.UpdateObject := FDUpdateSQL2;ne := ne + qrym.ApplyUpdates(0);if ne = 0 thenbeginqrym.CommitUpdates;ShowMessage('ok');end else ShowMessage('出错');
end;

采用事件方式 

procedure TfrmCachedUpdates.qrProductsUpdateRecord(ASender: TDataSet;ARequest: TFDUpdateRequest; var AAction: TFDErrorAction;AOptions: TFDUpdateRowOptions);
beginusProducts.ConnectionName := qrProducts.ConnectionName;usProducts.DataSet := qrProducts;usProducts.Apply(ARequest, AAction, AOptions);usCategories.ConnectionName := qrProducts.ConnectionName;usCategories.DataSet := qrProducts;usCategories.Apply(ARequest, AAction, AOptions);AAction := eaApplied;
end;

也可以采用另一种方式:

var qrya, qryb:TFDuqey;
qrya.sql = 'select * from a';
qryb.sql := 'select * from b';qry.onupdaterecord事件中执行qry复制记录到qrya中,qry 复制记录到qryb中,
分别更新qrya,qryb.
qry执行applyupdate, commitupdate.

附上生成SQL命令的方法

{*******************************************************}
{                                                       }
{               Delphi FireDAC Framework                }
{           FireDAC TFDUpdateSQL editor form            }
{                                                       }
{ Copyright(c) 2004-2021 Embarcadero Technologies, Inc. }
{              All rights reserved                      }
{                                                       }
{*******************************************************}
{$I FireDAC.inc}unit FireDAC.VCLUI.USEdit;interfaceuses
{$IFDEF MSWINDOWS}Winapi.Messages, Winapi.Windows,
{$ENDIF}System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Forms, Vcl.ComCtrls,Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Controls,FireDAC.Stan.Intf, FireDAC.Stan.Option,FireDAC.Comp.Client,FireDAC.VCLUI.OptsBase, FireDAC.VCLUI.UpdateOptions, FireDAC.VCLUI.Controls,FireDAC.VCLUI.Memo;typeTfrmFDGUIxFormsUSEdit = class(TfrmFDGUIxFormsOptsBase)pcMain: TPageControl;tsGenerate: TTabSheet;Label1: TLabel;cbxTableName: TComboBox;btnDSDefaults: TButton;btnGenSQL: TButton;btnServerInfo: TButton;GroupBox2: TLabel;lbKeyFields: TListBox;GroupBox3: TLabel;lbUpdateFields: TListBox;GroupBox4: TLabel;lbRefetchFields: TListBox;tsSQL: TTabSheet;tsOptions: TTabSheet;ptreeOptions: TFDGUIxFormsPanelTree;GroupBox5: TPanel;cbQuoteTabName: TCheckBox;cbQuoteColName: TCheckBox;frmUpdateOptions: TfrmFDGUIxFormsUpdateOptions;Bevel4: TBevel;Bevel1: TBevel;Bevel5: TBevel;pcSQL: TPageControl;tsInsert: TTabSheet;tsModify: TTabSheet;tsDelete: TTabSheet;tsLock: TTabSheet;tsUnlock: TTabSheet;tsFetchRow: TTabSheet;procedure cbxTableNameDropDown(Sender: TObject);procedure btnServerInfoClick(Sender: TObject);procedure btnDSDefaultsClick(Sender: TObject);procedure btnGenSQLClick(Sender: TObject);procedure cbxTableNameExit(Sender: TObject);procedure FormCreate(Sender: TObject);procedure mmSQLExit(Sender: TObject);procedure mmSQLKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);procedure cbxTableNameChange(Sender: TObject);procedure cbxTableNameClick(Sender: TObject);privateFConnection: TFDCustomConnection;FDataSet: TFDAdaptedDataSet;FUpdateSQL: TFDUpdateSQL;FOpts: IFDStanOptions;procedure UpdateExistSQLs;procedure GenCommands;function GetSQL(AIndex: Integer): TFDGUIxFormsMemo;function ExecuteBase(AUpdSQL: TFDUpdateSQL; const ACaption: String): Boolean;function UseField(const AFieldName: String): Boolean;publicclass function Execute(AUpdSQL: TFDUpdateSQL; const ACaption: String): Boolean;end;varfrmFDGUIxFormsUSEdit: TfrmFDGUIxFormsUSEdit;implementation{$R *.dfm}usesSystem.UITypes,Vcl.Dialogs, Data.DB,FireDAC.Stan.ResStrs, FireDAC.Stan.Util,FireDAC.DatS,FireDAC.Phys.Intf;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.FormCreate(Sender: TObject);
vari: Integer;oSQL: TFDGUIxFormsMemo;
beginfor i := 0 to 5 do beginoSQL := TFDGUIxFormsMemo.Create(Self);oSQL.Parent := pcSQL.Pages[i];oSQL.Left := 5;oSQL.Top := 5;oSQL.Width := oSQL.Parent.ClientWidth - 12;oSQL.Height := oSQL.Parent.ClientHeight - 12;oSQL.Anchors := [akLeft, akTop, akRight, akBottom];oSQL.Align := alNone;oSQL.Visible := True;oSQL.OnExit := mmSQLExit;oSQL.OnKeyDown := mmSQLKeyDown;end;
end;{ --------------------------------------------------------------------------- }
function TfrmFDGUIxFormsUSEdit.GetSQL(AIndex: Integer): TFDGUIxFormsMemo;
beginResult := pcSQL.Pages[AIndex].Controls[0] as TFDGUIxFormsMemo;
end;{ --------------------------------------------------------------------------- }
function TfrmFDGUIxFormsUSEdit.UseField(const AFieldName: String): Boolean;
beginResult := (FDataSet = nil) or (FDataSet.FieldCount = 0) or(FDataSet.FindField(AFieldName) <> nil);
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.cbxTableNameDropDown(Sender: TObject);
begin
{$IFDEF MSWINDOWS}cbxTableName.Perform(CB_SETDROPPEDWIDTH, Width div 2, 0);
{$ENDIF}if cbxTableName.Items.Count = 0 thentryFConnection.GetTableNames('', '', '', cbxTableName.Items, [osMy]);exceptcbxTableName.DroppedDown := False;raise;end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.cbxTableNameChange(Sender: TObject);
beginbtnGenSQL.Enabled := (cbxTableName.Text <> '');
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.cbxTableNameClick(Sender: TObject);
beginif cbxTableName.Text <> '' then beginbtnServerInfoClick(nil);btnDSDefaultsClick(nil);end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.cbxTableNameExit(Sender: TObject);
begin
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.btnServerInfoClick(Sender: TObject);
varoConnMeta: IFDPhysConnectionMetadata;oView: TFDDatSView;sName: String;eAttrs: TFDDataAttributes;i, j: Integer;
beginFConnection.ConnectionIntf.CreateMetadata(oConnMeta);oView := oConnMeta.GetTableFields('', '', cbxTableName.Text, '');trylbKeyFields.Items.Clear;lbUpdateFields.Items.Clear;lbRefetchFields.Items.Clear;for i := 0 to oView.Rows.Count - 1 do beginsName := oView.Rows[i].GetData('COLUMN_NAME');if sName = '' thensName := '_' + IntToStr(lbKeyFields.Items.Count);lbKeyFields.Items.Add(sName);lbUpdateFields.Items.Add(sName);lbRefetchFields.Items.Add(sName);end;for i := 0 to oView.Rows.Count - 1 do beginsName := oView.Rows[i].GetData('COLUMN_NAME');if UseField(sName) then beginj := oView.Rows[i].GetData('COLUMN_ATTRIBUTES');eAttrs := TFDDataAttributes(Pointer(@J)^);if (sName <> '') and (eAttrs * [caCalculated, caInternal, caUnnamed] = []) thenlbUpdateFields.Selected[i] := True;if eAttrs * [caAutoInc, caROWID, caDefault, caRowVersion, caCalculated, caVolatile] <> [] thenlbRefetchFields.Selected[i] := True;end;end;finallyFDFree(oView);end;oView := oConnMeta.GetTablePrimaryKeyFields('', '', cbxTableName.Text, '');tryfor i := 0 to oView.Rows.Count - 1 do beginsName := oConnMeta.UnQuoteObjName(oView.Rows[i].GetData('COLUMN_NAME'));if UseField(sName) then beginj := lbKeyFields.Items.IndexOf(sName);if j <> -1 thenlbKeyFields.Selected[j] := True;end;end;finallyFDFree(oView);end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.btnDSDefaultsClick(Sender: TObject);
varoConnMeta: IFDPhysConnectionMetadata;i, j: Integer;oFld: TField;sFldName: String;
beginif FDataSet = nil thenExit;if (FConnection <> nil) and (FConnection.ConnectionIntf <> nil) thenFConnection.ConnectionIntf.CreateMetadata(oConnMeta)elseoConnMeta := nil;if FDataSet.FieldCount <> 0 then beginfor i := 0 to lbKeyFields.Items.Count - 1 dolbKeyFields.Selected[i] := False;for i := 0 to lbUpdateFields.Items.Count - 1 dolbUpdateFields.Selected[i] := False;for i := 0 to lbRefetchFields.Items.Count - 1 dolbRefetchFields.Selected[i] := False;for i := 0 to FDataSet.FieldCount - 1 do beginoFld := FDataSet.Fields[i];if oFld.Origin = '' thensFldName := oFld.FieldNameelsesFldName := oFld.Origin;if oConnMeta <> nil thensFldName := oConnMeta.UnQuoteObjName(sFldName);j := lbKeyFields.Items.IndexOf(sFldName);if j <> -1 then beginlbKeyFields.Selected[j] := pfInKey in oFld.ProviderFlags;lbUpdateFields.Selected[j] := pfInUpdate in oFld.ProviderFlags;lbRefetchFields.Selected[j] := (oFld.AutoGenerateValue <> TAutoRefreshFlag.arNone);end;end;end;if FDataSet.Adapter <> nil then beginFOpts.UpdateOptions.RestoreDefaults;frmUpdateOptions.LoadFrom(FOpts.UpdateOptions);end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.btnGenSQLClick(Sender: TObject);
beginfrmUpdateOptions.SaveTo(FOpts.UpdateOptions);GenCommands;UpdateExistSQLs;pcMain.ActivePage := tsSQL;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.mmSQLExit(Sender: TObject);
beginUpdateExistSQLs;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.mmSQLKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
beginif (Shift = [ssCtrl]) and ((Key = Ord('A')) or (Key = Ord('a'))) then beginTFDGUIxFormsMemo(Sender).SelectAll;Key := 0;endelse if Key = VK_ESCAPE then beginModalResult := mrCancel;Key := 0;end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.UpdateExistSQLs;
vari: Integer;s: String;
beginfor i := 0 to 5 do begins := pcSQL.Pages[i].Caption;if GetSQL(i).Lines.Count > 0 then beginif Pos('*', s) = 0 thens := s + ' *';endelse beginif Pos('*', s) <> 0 thens := Copy(s, 1, Pos('*', s) - 1);end;pcSQL.Pages[i].Caption := s;end;
end;{ --------------------------------------------------------------------------- }
procedure TfrmFDGUIxFormsUSEdit.GenCommands;
vari, j: Integer;oCmdGen: IFDPhysCommandGenerator;oTab: TFDDatSTable;oCol: TFDDatSColumn;oFld: TField;sFldName: String;oCmd: IFDPhysCommand;oOpts: IFDStanOptions;
beginoTab := TFDDatSTable.Create;FConnection.ConnectionIntf.CreateCommand(oCmd);tryoOpts := oCmd.Options;oOpts.UpdateOptions.Assign(FOpts.UpdateOptions);oOpts.FetchOptions.RowsetSize := 0;oOpts.FetchOptions.Mode := fmManual;oOpts.FetchOptions.Items := oOpts.FetchOptions.Items + [fiMeta];// define tableoCmd.Prepare('select * from ' + cbxTableName.Text);oCmd.Define(oTab);oTab.SourceName := cbxTableName.Text;// Include into Where only fields existing in dataset and// having pfInWhere in ProviderFlagsif FDataSet <> nil thenfor i := 0 to oTab.Columns.Count - 1 do beginoCol := oTab.Columns[i];if coInWhere in oCol.Options then beginoCol.Options := oCol.Options - [coInWhere];for j := 0 to FDataSet.FieldCount - 1 do beginoFld := FDataSet.Fields[j];if oFld.Origin = '' thensFldName := oFld.FieldNameelsesFldName := oFld.Origin;if (AnsiCompareText(oCol.Name, sFldName) = 0) and(pfInWhere in oFld.ProviderFlags) thenoCol.Options := oCol.Options + [coInWhere];end;end;end;// Include into where selected Key fieldsfor i := 0 to lbKeyFields.Items.Count - 1 do beginoCol := oTab.Columns.ColumnByName(lbKeyFields.Items[i]);if lbKeyFields.Selected[i] thenoCol.Options := oCol.Options + [coInKey, coInWhere]elseoCol.Options := oCol.Options - [coInKey, coInWhere];end;// Include into update selected Updating fieldsfor i := 0 to lbUpdateFields.Items.Count - 1 do beginoCol := oTab.Columns.ColumnByName(lbUpdateFields.Items[i]);if lbUpdateFields.Selected[i] thenoCol.Options := oCol.Options + [coInUpdate, coInWhere]elseoCol.Options := oCol.Options - [coInUpdate, coInWhere];end;// Include into refetch selected Refreshing fieldsfor i := 0 to lbRefetchFields.Items.Count - 1 do beginoCol := oTab.Columns.ColumnByName(lbRefetchFields.Items[i]);if lbRefetchFields.Selected[i] thenoCol.Options := oCol.Options + [coAfterInsChanged, coAfterUpdChanged]elseoCol.Options := oCol.Options - [coAfterInsChanged, coAfterUpdChanged];end;// Setup SQL generatorFConnection.ConnectionIntf.CreateCommandGenerator(oCmdGen, oCmd);oCmdGen.FillRowOptions := [foData, foBlobs, foDetails, foClear] +FDGetFillRowOptions(oOpts.FetchOptions);oCmdGen.GenOptions := [goBeautify];if cbQuoteColName.Checked thenoCmdGen.GenOptions := oCmdGen.GenOptions + [goForceQuoteCol]elseoCmdGen.GenOptions := oCmdGen.GenOptions + [goForceNoQuoteCol];if cbQuoteTabName.Checked thenoCmdGen.GenOptions := oCmdGen.GenOptions + [goForceQuoteTab]elseoCmdGen.GenOptions := oCmdGen.GenOptions + [goForceNoQuoteTab];oCmdGen.Options := oOpts;oCmdGen.Table := oTab;// Generate commandsif FOpts.UpdateOptions.EnableInsert thenGetSQL(0).Lines.Text := oCmdGen.GenerateInsert;if FOpts.UpdateOptions.EnableUpdate thenGetSQL(1).Lines.Text := oCmdGen.GenerateUpdate;if FOpts.UpdateOptions.EnableDelete thenGetSQL(2).Lines.Text := oCmdGen.GenerateDelete;if FOpts.UpdateOptions.LockMode <> lmNone then beginGetSQL(3).Lines.Text := oCmdGen.GenerateLock;GetSQL(4).Lines.Text := oCmdGen.GenerateUnLock;end;GetSQL(5).Lines.Text := oCmdGen.GenerateSelect(False);finallyFDFree(oTab);oCmdGen := nil;oCmd := nil;end;
end;{ --------------------------------------------------------------------------- }
function TfrmFDGUIxFormsUSEdit.ExecuteBase(AUpdSQL: TFDUpdateSQL; const ACaption: String): Boolean;
varoTestCmd: TFDCustomCommand;i: Integer;function GetConnection: TFDCustomConnection;beginif FUpdateSQL.ConnectionName <> '' thenResult := FDManager.AcquireConnection(FUpdateSQL.ConnectionName, FUpdateSQL.Name)else beginif FUpdateSQL.Connection <> nil thenResult := FUpdateSQL.Connectionelse if (FDataSet <> nil) and (FDataSet.PointedConnection <> nil) thenResult := FDataSet.PointedConnectionelseResult := oTestCmd.GetConnection(False);if Result = nil thenraise Exception.Create(S_FD_USEditCantEdit);Result := FDManager.AcquireConnection(Result, FUpdateSQL.Name);end;end;function GetParentObject: TPersistent;beginif FDataSet <> nil thenResult := FDataSetelseResult := oTestCmd;end;function GetUpdateOptions: TFDBottomUpdateOptions;beginif FDataSet <> nil thenResult := FDataSet.OptionsIntf.UpdateOptions as TFDBottomUpdateOptionselseResult := oTestCmd.UpdateOptions;end;beginLoadState;FUpdateSQL := AUpdSQL;FDataSet := FUpdateSQL.DataSet;oTestCmd := FUpdateSQL.Commands[arInsert];FConnection := GetConnection;tryFConnection.CheckActive;if (FDataSet <> nil) and not FDataSet.Active and(FDataSet.Command <> nil) and (Trim(FDataSet.Command.CommandText.Text) <> '') and(MessageDlg(S_FD_USEditOpenDS, mtConfirmation, [mbYes, mbNo], -1) = mrYes) thenFDataSet.Open;FOpts := TFDOptionsContainer.Create(GetParentObject, TFDFetchOptions,TFDUpdateOptions, TFDTopResourceOptions, nil);FOpts.ParentOptions := GetUpdateOptions.Container as IFDStanOptions;FOpts.UpdateOptions.Assign(GetUpdateOptions);Caption := Format(S_FD_USEditCaption, [ACaption]);btnDSDefaults.Enabled := (FDataSet <> nil);btnGenSQL.Enabled := False;pcMain.ActivePage := tsGenerate;ActiveControl := cbxTableName;frmUpdateOptions.LoadFrom(FOpts.UpdateOptions);frmUpdateOptions.SQLGenerator := True;cbxTableName.Text := GetUpdateOptions.UpdateTableName;if (cbxTableName.Text = '') and (FDataSet <> nil) and (FDataSet.Table <> nil) thencbxTableName.Text := FDataSet.Table.ActualOriginName;if cbxTableName.Text <> '' then begincbxTableNameChange(cbxTableName);cbxTableNameClick(cbxTableName);end;if btnDSDefaults.Enabled thenbtnDSDefaultsClick(nil);for i := 0 to 5 doGetSQL(i).RDBMSKind := FConnection.RDBMSKind;GetSQL(0).Lines.SetStrings(AUpdSQL.InsertSQL);GetSQL(1).Lines.SetStrings(AUpdSQL.ModifySQL);GetSQL(2).Lines.SetStrings(AUpdSQL.DeleteSQL);GetSQL(3).Lines.SetStrings(AUpdSQL.LockSQL);GetSQL(4).Lines.SetStrings(AUpdSQL.UnlockSQL);GetSQL(5).Lines.SetStrings(AUpdSQL.FetchRowSQL);UpdateExistSQLs;Result := (ShowModal = mrOK);finallyFDManager.ReleaseConnection(FConnection);end;if Result then beginAUpdSQL.InsertSQL.SetStrings(GetSQL(0).Lines);AUpdSQL.ModifySQL.SetStrings(GetSQL(1).Lines);AUpdSQL.DeleteSQL.SetStrings(GetSQL(2).Lines);AUpdSQL.LockSQL.SetStrings(GetSQL(3).Lines);AUpdSQL.UnlockSQL.SetStrings(GetSQL(4).Lines);AUpdSQL.FetchRowSQL.SetStrings(GetSQL(5).Lines);end;SaveState;
end;{ --------------------------------------------------------------------------- }
class function TfrmFDGUIxFormsUSEdit.Execute(AUpdSQL: TFDUpdateSQL; const ACaption: String): Boolean;
varoFrm: TfrmFDGUIxFormsUSEdit;
beginoFrm := TfrmFDGUIxFormsUSEdit.Create(nil);tryResult := oFrm.ExecuteBase(AUpdSQL, ACaption);finallyFDFree(oFrm);end;
end;end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java研发规范

文章目录 一、code规范二、需求跟进实践总结**需求分析****设计****开发** 三、幂等&一致性四、代码规范五、项目流程5.1 详设汇总5.2 排期5.3 数据组影响5.4 全流程SOP预案5.5 每日测试进度汇总5.6 灰度方案5.7 上线计划5.8 风险评估 一、code规范 【强制】POJO类中布尔类…

打造卓越摄影作品,尽享专业级编辑体验——DxO PhotoLab 7 for Mac

DxO PhotoLab 7 for Mac 是一款功能强大的专业照片编辑软件&#xff0c;为摄影爱好者和专业摄影师提供了优秀的工具和功能&#xff0c;让您能够轻松打造卓越的摄影作品并实现专业级的编辑效果。 DxO PhotoLab 7 提供了一套先进的图像处理算法&#xff0c;能够准确地还原照片的…

ORACLE 在内存管理机制上的演变和进化

截止目前&#xff0c;计算机内存仍然被认为是我们可以获得的最快速度的物理存储设备。 将频繁访问的数据尽可能地置于内存中&#xff0c;已成为当前各种软件和应用程序提高数据访问性能&#xff0c;减少访问延迟的最为有效的途径。 然而&#xff0c;内存作为关键的计算资源&am…

K8S-存储卷,pv,pvc

pv&#xff0c;pvc 一、emptyDir存储卷1.概述2.示例 二、hostPath存储卷1.概述 三、nfs共享存储卷1.在stor01节点上安装nfs&#xff0c;并配置nfs服务2.master节点操作3.在nfs服务器上创建index.html4.master节点操作 四、PVC 和 PV1.概述2.PV和PVC之间的相互作用遵循的生命周期…

LeetCodeTop100(一)

文章目录 p1.1. 两数之和p2.2. 两数相加p3.3. 无重复字符的最长子串p4. 4.寻找两个正序数组的中位数p5.5. 最长回文子串p7.11. 盛最多水的容器p8.15. 三数之和p9.17. 电话号码的字母组合p10.19. 删除链表的倒数第 N 个结点p11.20. 有效的括号p12.21. 合并两个有序链表p13.22. 括…

基于Java的传统文化宣传平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【QandA C++】进程、线程、协程、进程间通信的方式、线程同步机制、守护线程、僵尸进程、孤儿进程、线程切换的资源等重点知识汇总

目录 进程、线程和协程的区别 线程和进程的区别 进程 线程 进程间通信方式 线程同步机制 守护进程、僵尸进程、孤儿进程 进程/线程切换过程切换的资源有哪些 进程、线程和协程的区别 进程 线程 协程 定义 资源分配和拥有的基本单位 程序执行的基本单位 用户态的轻…

python接口自动化(一)--什么是接口、接口优势、类型(详解)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一…

Ci2451-2.4g无线MCU收发芯片

Ci2451 是一款集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片。 无线MCU解决方案,集成丰富的MCU资源、更小尺寸,来满足设计中的各种内存、功率、尺寸要求,充分缩短2.4GHz无线产品设计周期并优化产品成本。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff…

005:根据股票代码和起始日期获取K线数据

我们改进《001》中的部分&#xff0c;因为他他没法在可视化界面输入信息&#xff0c;这样太麻烦。我们设法在可视化界面输入股票代码和起始日期&#xff0c;这样可以灵活得多。这部分&#xff0c;我们仍旧只获取日K线的数据。 import tkinter as tk from tkinter import messa…

Spring Cloud Gateway实战WebFlux解析请求体及抛出指定错误代码和信息

概述 基于Spring Cloud开发微服务时&#xff0c;使用Spring Cloud原生自带的Gateway作为网关&#xff0c;所有请求都需要经过网关服务转发。 为了防止恶意请求刷取数据&#xff0c;对于业务请求需要进行拦截&#xff0c;故而可在网关服务增加拦截过滤器。基于此&#xff0c;有…

Aruba CX交换机 VSF配置

目前 Aruba CX 交换机中的 6300F 和 6300M 支持 VSF 功能&#xff0c;要求同型号堆叠。 6300 交换机仅仅最后 4 个 SFP56 端口支持 VSF link 6200F : all uplink ports with 10G speed can be configured as VSF link 6200F: VSF allows stacks to be formed using any combin…

【C语言】快速排序

文章目录 一、hoare版本二、挖坑法三、前后指针法四、非递归快排五、快速排序优化1、三数取中选key值2、小区间优化 六、代码测试 一、hoare版本 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

信息化发展56

数据开发利用 通过数据集成、数据挖掘和数据服务&#xff08;目录服务、查询服务、浏览和下载服务、数据分发服务&#xff09;、数据可视化、信息检索等技术手段&#xff0c; 帮助数据用户从数据资源中找到所需要的数据&#xff0c; 并将数据以一定的方式展现出来&#xff0c;…

Databend 源码阅读:配置管理

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09;澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer https://github.com/PsiACE 对于 Databend 这样复杂的数据库服务端程序&#xff0c;往往需要支持大量的可配置选项&am…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题&#xff1a;7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n&#xff0c;如果n值为0或者1&#xff0c;向屏幕输出“0 indian boy.”或“1 indian boy.”&#xff1b;如果n大于1&#xff0c;比如9&#xff0c;则输出“9 in…

查看Linux系统信息的常用命令

文章目录 1. 机器配置查看2. 常用分析工具3. 常用指令解读3.1 lscpu 4. 定位僵尸进程5. 参考 1. 机器配置查看 # 总核数物理CPU个数x每颗物理CPU的核数 # 总逻辑CPU数物理CPU个数x每颗物理CPU的核数x超线程数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| w…

Jmeter接口自动化和Python接口自动化,如何选择?

选择Jmeter或Python进行接口自动化测试取决于您的具体需求和环境。以下是一些可以考虑的因素&#xff1a; 1. 语言熟悉度&#xff1a;如果您对Java更熟悉&#xff0c;那么Jmeter可能是更好的选择。而如果您的团队或个人对Python更熟悉&#xff0c;那么Python可能是更好的选择。…

Python数据分析之Excel

Openpyxl库 1、Openpyxl模块2、Excel写入2.1、新建2.2、添加数据2.3、单元格格式 3、Excel读取4、Excel的CRUD4.1、查4.2、改4.3、删 1、Openpyxl模块 Openpyxl是一个用于处理xlsx格式Excel表格文件的第三方python库&#xff0c;几乎支持Excel表格的所有操作 基本概念&#x…