利用原生ADO保存对应字段

本文介绍了一种在ADO环境中批量更新数据的高效方法,通过筛选字段和利用ADO Recordset对象,实现根据需要或不需要的条件批量更新数据库表中的特定字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{****************************************************************************

将aFields字段里面的对应字段保存到ADORs;

ArrField和SFValue,说明需要不需要保存的字段;

(SFValue为true时,保存ArrField里在aFields的字段值到ADORs;

 SFValue为False时,保存ArrField里不在aFields的字段值到ADORs;

由于调用fnSetADOFldValue提供的ADORs和Fields结构一样,故调用ADORs.Fields[sFldName].value := aFields[sFldName].Value不会有字段不符的问题

*******************************************************************************

}


function TAdodsOp.fnSetADOFldValue(ADORs:oleVariant;aFields: Fields;ArrField: array of string; SFValue: Boolean): Boolean;

var
  bIsFind:Boolean;
  i,j:Integer;
  sFldName:string;
begin
  try
    for I := 0 to aFields.Count - 1 do //Iterate
    begin
      bIsFind:=False;
      sFldName := aFields[i].Name;
      if High(ArrField)>=0 then
      begin
        for j := 0 to High(ArrField)  do
        if UpperCase(sFldName)=UpperCase(ArrField[j])then
        begin
          bIsFind := True;
          Break;
        end;
        if SFValue then //需要赋值
        begin
          if not bIsFind then Continue;
        end
        else //不需要
        begin
          if bIsFind then Continue;
        end;
      end;
      ADORs.Fields[sFldName].value := aFields[sFldName].Value;
    end; //for  i
    Result := True;
  except
    raise;
    Result := False;
  end;

end;



//使用原生ADO来保存数据 ,参数TblName可以是表明,也可以是SQL语句
    //参数arrfield表示SFValue =true 需要赋值的字段,SFValue=False 表示不需要赋值
    //如果是空值表示全部的字段需要赋值
function TForm1.ADoSaveData(ADataSet:TCustomADODataSet;TblName:String;
              ArrField: array of string;SFValue:Boolean=True;
              RecordType:TAffectRecords=arAll):Boolean;
const
  sSQL = 'SELECT * FROM %S WHERE 1=0';
var
  ADORs:oleVariant;
  FConnObject: _Connection;
  vFiltered: Boolean;
  vFilterGroup: TFilterGroup;
begin
  Result := False;
  if ADataSet.IsEmpty  then Exit;
  if ADataSet.LockType <> ltBatchOptimistic then Exit;
  ADORs:=CreateOleObject('ADODB.Recordset');
  FConnObject := FGlobalDM.aConnMain.ConnectionObject;
  ADORs.Open(Format(sSQL,[TblName]),FConnObject,3,2);


  ADataSet.DisableControls;
  try
    vFiltered := ADataSet.Filtered;
    vFilterGroup := ADataSet.FilterGroup;
    try


      with ADataSet.Recordset do
      try
        case RecordType of
          arAll:
          begin
            ADataSet.Filtered := True;
            ADataSet.FilterGroup := fgPendingRecords;


            if not BOF then MoveFirst;
            while not eof do
            begin
              ADORs.Addnew(); //创建一条新记录。
              try
                fnSetADOFldValue(ADORs,Fields,ArrField,SFValue);
                //fnSetADOFldValue(ADORs,ADataSet.Recordset.Fields,ArrField,SFValue);
                ADORs.Update;//保存对 Recordset 对象中的一条单一记录所做的更改。
                Result := True;
              except
                raise;
                Result := False;
                Break;
              end;
              MoveNext;
            end;
          end;


          arCurrent :
          begin
             ADORs.AddNew;
             try
               fnSetADOFldValue(ADORs,Fields,ArrField,SFValue);
               ADORs.Update;
               Result := True;
             except
               raise;
               Result := False;
             end;
          end;


        end;
        
        If ADORs.State <> adStateClosed Then ADORs.Close;
      finally
        if not VarIsEmpty(ADORs) then
        begin
         ADORs := Unassigned;
        end;
      end;
    finally
     ADataSet.Filtered := vFiltered;
     ADataSet.FilterGroup := vFilterGroup;
    end;
  finally
    ADataSet.EnableControls;
  end;
end;

<think>好的,用户现在问的是如何使用SqlSugar ORM框架来实现特定SQL字段的筛选,具体是希望执行类似`select [Eng manager xx] from [dbo].[tv_-xx]`的查询。首先,我需要回忆一下SqlSugar的基本用法,因为之前的回答提到了SQLAlchemy和Django ORM,但用户这次明确提到了SqlSugar。 首先,用户需要映射表结构,尤其是带有特殊字符的表名和字段名。在SqlSugar中,表名和字段名的映射通常通过特性(Attribute)来处理,比如使用[SugarTable]和[SugarColumn]。例如,对于表名`[dbo].[tv_-xx]`,需要在模型类上使用[SugarTable("[tv_-xx]")],并指定模式为dbo。字段`[Eng manager xx]`则需要用[SugarColumn("Eng manager xx")]来映射属性。 接下来,用户可能需要动态查询,特别是当模型没有预先定义的时候。SqlSugar支持动态对象查询,可以使用Queryable<dynamic>来处理这种情况,直接指定表名和字段名,这样不需要预先定义模型类。这对于快速操作或者表结构不固定的情况很有用。 另外,用户可能关心的是如何构建查询条件。SqlSugar的查询条件构建类似于LINQ,可以使用.Where()方法,并且支持Lambda表达式,这样代码会比较直观。例如,.Where("Eng manager xx = @value", new { value = "目标值" })。 还需要考虑权限问题,比如用户是否有访问该表的权限,这在之前的引用[3]中提到了数据库访问被拒绝的情况,所以可能需要提醒用户检查连接字符串的权限设置,确保用户有执行查询的权限。 此外,需要注意SqlSugar在处理特殊字符时的转义问题,特别是在拼接SQL语句时,避免SQL注入攻击。SqlSugar本身会参数化查询,所以用户不需要手动处理参数,但明确说明这一点可以增加回答的可靠性。 用户可能还希望看到具体的代码示例,包括模型定义和查询的完整流程,比如如何配置连接字符串,创建SqlSugarClient实例,以及执行查询并获取结果。同时,可能需要提到结果的处理,比如匿名类型或动态对象的处理方式。 最后,根据用户之前的问题,他们可能对性能优化、复杂条件筛选或跨表查询感兴趣,所以在相关问题中可以建议这些方向,帮助用户扩展知识。 总结步骤:1. 定义模型类映射表和字段;2. 使用SqlSugar的查询方法选择特定字段;3. 处理动态查询的情况;4. 注意事项包括权限、特殊字符和性能优化。</think>### 通过SqlSugar ORM实现特定字段筛选 #### 一、模型定义与映射 在SqlSugar中需通过`[SugarTable]`和`[SugarColumn]`特性映射特殊表名和字段: ```csharp // 定义与表[dbo].[tv_-xx]对应的模型类 [SugarTable("[tv_-xx]", Schema = "dbo")] // 指定表名和模式 public class TvXx { [SugarColumn("Eng manager xx")] // 映射特殊字段名 public string EngManagerXx { get; set; } // 其他字段可继续定义... } ``` #### 二、单字段筛选查询 通过`Queryable<T>`接口实现类似`SELECT [Eng manager xx]`的查询: ```csharp // 创建SqlSugarClient实例 var db = new SqlSugarClient(new ConnectionConfig { ConnectionString = "Server=.;Database=xx;Uid=user;Pwd=pass;", DbType = DbType.SqlServer, IsAutoCloseConnection = true }); // 筛选指定字段(自动生成SELECT子句) var result = db.Queryable<TvXx>() .Where(x => x.EngManagerXx == "目标值") .Select(x => x.EngManagerXx) // 仅选择[Eng manager xx]字段 .ToList(); ``` #### 三、动态字段处理(无需预定义模型) 若需直接操作动态字段,可使用匿名对象或`Dynamic`模式: ```csharp // 动态表名+字段名查询 var dynamicResult = db.Queryable<dynamic>() .AS("[dbo].[tv_-xx]") // 指定动态表名 .Where("Eng manager xx = @value", new { value = "目标值" }) .Select("Eng manager xx") // 显式指定字段 .ToList(); ``` #### 四、原生SQL执行(高级场景) 对于复杂逻辑可直接执行原生SQL: ```csharp var sql = "SELECT [Eng manager xx] FROM [dbo].[tv_-xx] WHERE [Eng manager xx] = @value"; var param = new { value = "目标值" }; var rawResult = db.Ado.SqlQuery<string>(sql, param); // 返回字符串列表 ``` #### 五、注意事项 1. **特殊字符转义**:表名/字段名含空格或连字符时需用`[]`包裹[^1] 2. **参数化查询**:SqlSugar自动处理参数化,防止SQL注入[^4] 3. **权限验证**:确保数据库用户拥有`SELECT`权限(参考引用[3]的授权方式) 4. **空值处理**:使用`.WhereIF(condition, ...)`动态处理可选条件 #### 六、完整操作流程 ```csharp // 配置连接 var config = new ConnectionConfig { ConnectionString = "数据库连接字符串", DbType = DbType.SqlServer, IsAutoCloseConnection = true }; // 执行查询 using (var db = new SqlSugarClient(config)) { // 方式1:强类型查询 var list1 = db.Queryable<TvXx>() .Select(x => x.EngManagerXx) .ToList(); // 方式2:动态查询 var list2 = db.Queryable<dynamic>() .AS("[dbo].[tv_-xx]") .Select("[Eng manager xx]") .Where("[Eng manager xx] LIKE '%关键词%'") .ToList(); } ``` ### 相关问题 1. 如何通过SqlSugar实现多表联合查询? 2. SqlSugar在筛选时如何优化分页性能? 3. 如何处理SqlSugar映射的字段类型不匹配问题? 4. SqlSugar是否支持JSON字段的条件筛选?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值