通用的更新方法

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 用来更新数据
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;
时间: 2024-10-12 10:27:18

通用的更新方法的相关文章

MVC LINQ中用封装的TSQL通用更新方法

把TSQL拿出来,做了一个封装,适用的所有表,更新有两种,普通更新和记数更新 看代码:这两个方法是写在DAL里的数据操作基类里的,只有它的子类可以用它,所以用protected做为限制 /// <summary>        /// 通用更新方法        /// </summary>        /// <param name="tableName">表名</param>        /// <param name=&q

[Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数arguments对象.它是一个类数组对象,并不是一个标准的数组,所以无法使用数组原型中的方法,因此无法使用arguments.forEach这样的形式来遍历每一个参数.这里我们必须使用call方法来对使用forEach方法. function highlight(){ [].forEach.call(argume

WinForm通用自动更新器AutoUpdater项目实战

一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能.因为我们的程序中可能包含多个类型的文件,比如exe.dll. config.xml.bat等等自定义格式的后缀名文件,所以要支持多文件类型的更新. 本期同样带给大家分享的是阿笨在实际工作中遇到真实项目场景,请跟随阿笨的视角去如何开发实现WinForm通用自动更新

多说【最近访客】JS插件通用代码使用方法

多说[最近访客]JS插件通用代码使用方法 多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加一次. <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名&q

使用ResultSet,写了一个通用的查询方法

此方法很烂,以后优化 /** * 通用的查询方法:SELECT */ @SuppressWarnings({ "unchecked", "rawtypes" }) public List testResultSet(String sql) { Connection connection = null; Statement statement = null; ResultSet rs = null; try { // 1.获取Connection connection

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

Android SDK离线安装更新方法

直接使用Android SDK Manager进行下载.更新速度很慢,有时候会出现错误.网上查找了不少网友的方法,做个总结. 1.启动Android SDK Manager,并等待reposity加载完成. 2.点击右下角图标,显示Android SDK Manager Log,内容如下: Fetching http://dl-ssl.google.com/android/repository/addons_list-2.xml Fetched Add-ons List successfully

[其他]Android SDK离线文件路径以及安装更新方法

一.离线安装Android SDK文件路径 转载自:http://www.oschina.net/code/snippet_1539302_45940 Google TV Addon, Android API13, revision 1 https://dl-ssl.google.com/android/repository/google_tv-13_r01.zip Android SDK Platform-tools,revision 21 [*] http://dl-ssl.google.c

Android应用程序通用自动脱壳方法研究

Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从一开始只有甲方公司提供服务到现在大型互联网公司都有自己的加固保护服务,同时与金钱相