通用的更新方法 THlsImplBase
function THlsImplBase.UpdateTableData(ATableName, AKeyField: AnsiString; var AData: Variant): Boolean; var LSql: string; I: Integer; {$IFDEF MSSQL} LProvider: TProvider; LDataSet: TDataSet; {$ENDIF} {$IFDEF ORACLE} LOraQuery: TOraQuery; LDataProvider: TOraProvider; {$ENDIF} LErrCount: Integer; begin Result := False; if ATableName = '' then Exit; if AData = null then begin Result := True; Exit; end; {$IFDEF MSSQL} if AKeyField = '' then Exit; LSql := 'select * from ' + ATableName + ' where 1 = 2'; LDataSet := CreateDataSet(LSql); if not Assigned(LDataSet) then Exit; LProvider := TProvider.Create(nil); LProvider.UpdateMode := upWhereKeyOnly; LProvider.DataSet := LDataSet; AKeyField := LowerCase(AKeyField); for I := 0 to LDataSet.FieldCount - 1 do begin if (LowerCase(LDataSet.Fields[I].FieldName) = AKeyField) or (Pos(';' + LowerCase(LDataSet.Fields[I].FieldName) + ';', AKeyField) > 0) then LDataSet.Fields[I].ProviderFlags := LDataSet.Fields[I].ProviderFlags + [pfInKey] else LDataSet.Fields[I].ProviderFlags := []; end; try try LProvider.ApplyUpdates(AData, -1, LErrCount); except end; Result := LErrCount = 0; finally LDataSet.Free; LProvider.Free; end; {$ENDIF} {$IFDEF ORACLE} LSql := 'select * from ' + ATableName + ' where 1=2'; LSql := StringReplace(LSql, '(nolock)', '', [rfReplaceAll, rfIgnoreCase]); LOraQuery := TOraQuery.Create(nil); LOraQuery.Session := FConnection; LOraQuery.SQL.Text := LSql; LOraQuery.Open(); LDataProvider := TOraProvider.Create(nil); LDataProvider.DataSet := LOraQuery; LDataProvider.UpdateMode := upWhereKeyOnly; AKeyField := LowerCase(AKeyField); for I := 0 to LOraQuery.FieldCount - 1 do begin if (LowerCase(LOraQuery.Fields[I].FieldName) = AKeyField) or (Pos(';' + LowerCase(LOraQuery.Fields[I].FieldName) + ';', AKeyField) > 0) then LOraQuery.Fields[I].ProviderFlags := LOraQuery.Fields[I].ProviderFlags + [pfInKey] else LOraQuery.Fields[I].ProviderFlags := []; end; try try LDataProvider.ApplyUpdates(AData, -1, LErrCount); except end; Result := LErrCount = 0; finally LDataProvider.Free; LOraQuery.Close; LOraQuery.Free; end; {$ENDIF} end;
//Provider 用来更新数据
代码\Source\Core\HlsImplBase.pas
function THisIntfService.UpdateTable(ADatas: TUpdateTableDatas): Boolean; var I: Integer; LData: Variant; LTableData: TUpdateTableData; begin Result := False; if Length(ADatas) = 0 then Exit; StartTrans(); try for I := Low(ADatas) to High(ADatas) do begin LTableData := ADatas[I]; LData := LTableData.DataValue; HisMzFuncs.UnCompressVariants(LData); if not Self.UpdateTableData(LTableData.TableName, LTableData.KeyFields, LData) then//里面利用了Provider 进行提交数据 begin Self.RollBack; Exit; end; end; except RollBack(); Exit; end; Commit(); Result := True; end;
好的代码像粥一样,都是用时间熬出来的
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2017-09-17 delphi 右键删除dbgrid行
2017-09-17 在DBGrid中,单击单元格选择整行,双击又可编辑单元格