//数据库数据加密 Schema 数据库名称,Name:要查询的表的名称
procedure TOperationDM.DataOperations(Schema:String;Name:String);
var
  i,j,k:Integer;
  strSql,allSql:String;
  counts:Integer;
  list :TStringList;
  strType:Sting;begin
  list :=TStringList.Create;
  OperationADOCon.Close;
  OperationADOCon.ConnectionString:= TOper.readParamdb;
  OperationADOCon.Open;
  try
     with ADOQuery1 do
     begin
        strSql := 'SELECT DATA_TYPE FROM information_schema.`COLUMNS`'
                +'WHERE TABLE_SCHEMA LIKE "'+Schema+'" '
                +'AND TABLE_NAME LIKE "'+Name+'"';        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        sql.Add(strSql);
        ADOQuery1.Open;
        counts := ADOQuery1.RecordCount;
        if(counts >0) then
        begin
          for i:=0 to counts-1 do
          begin
           list.Add(ADOQuery1.fieldbyName('DATA_TYPE').AsString);
          end;
          for j:=0 to list.Count-1 do
          begin
             strType := list[j];
             if (Trim(strType) <> 'int') then   //判定,除了int类型的数据以外其他类型的数据全部加密
             begin
                 //将数据类型所对应的数据进行加密操作(问题是这个对应的值如何获得呢,请高手赐教,本人刚接触delphi还有很多东西高步清楚的)
               
             end;
          end;
        end;
     end;
  finally
   OperationADOCon.Close;
   ADOQuery1.SQL.Clear;
   ADOQuery1.Close;
  end;
end;

解决方案 »

  1.   

    既然用ADO,那就
    直接用TADOQuery去
    SELECT 表名的全部字段
    用TField取类型和值即可。
    如 Fields[0].DataType 和 Fields[0].AsString (或 As 其它类型)
    你会发现ADO.Connection提供很多与Schema有关的信息。
      

  2.   

    下面的那部分调用加密的程序基本完成,可是到那个得到数据类型,列名,那部分查询出来10条数据,可是当我取值的时候,程序会把第一条重复10次保存到list中,什么原因,我之前都是这么写的,
    for i:=0 to counts-1 do
              begin
               list.Add(ADOQuery1.fieldbyName('DATA_TYPE').AsString+‘=’+ADOQuery1.fieldByName('column_name').AsString);
    end;这里的counts就是我ADOQuery1.RecordCount值
      

  3.   

    加密后存储,加密方法很多用密钥自定义规则,或者用MD5等等已经有成熟案例的加密方法,至于显示时要不要加密看需求,只加密关键字段,犯不着什么东西都加密,累不累,有没有必要?
    重复10次保存到list?没看到你有Next,移动指针了吗?
      

  4.   

    写了next就可以了,我也是刚学习的,还多东西一时间注意不到
      

  5.   

    高手,问你一个问题,例如我现在有个list,list中的数据是 ‘001’,‘003’,‘001’,‘005’我要怎么给这个list进行分组
      

  6.   

    要么查询出数据后放到list再去写分组的算法,要么在数据查询的时候在SQL里做分组(这种方法更方便快捷),再插入list
      

  7.   

    恩不能写个案例出来,刚刚弄这个delphi,好多地方有点转不过弯来
      

  8.   

    用 TStringList,它有个参数是 Objects,那你就可以把分组后的内容放在第二层。比如你有这样的数据:'001', '000012'
    '002', '000063'
    '001', '000015'你想用第一个Field去分组,也就是'001' 下有一个List内容为 '000012' 和 '000015'
    '002' 下有一个List内容为 '000063'那就这么写:1.找到001,取出它内部的List,插入'000012'
    2.没找到001,新增一个List,插入'000012'和'001'一起插入到分组List比如分组List叫 GList: TStringList; 
    内容List叫 List: TStringList;则上面代码就是Str1:='001';
    Str2:='000012';
    ......
    Index:=GList.IndexOf(Str1);
    if Index>=0 then //找到了
      TStringList(GList.Objects[Index]).Add(Str2)
    else //没找到
    begin
      List:=TStringList.create;
      List.Add(Str2);
      GList.AddObject(Str1, List);
    end;不知道这样子是不是你所谓分组的意思?
    如果不是,拜托你把分组的意思讲明白。
      

  9.   

    我现在这个东西已经解决,谢谢!
    还有个问题,就是list中的数据为list{'001=2','002=3','001=4','003=6'}
    等号前面是编号,等号后面是得分,delphi 中TStringList是可以这么写的
    我想得到一个新的list的list{'001=6','002=3','003=6'},意思就是如果编号一样的则将得分相加,不相等的直接将这一项存在新的list中
      

  10.   

    没有必要搞list的list,每次做动作之前循环判断一下你的list不就行了,有则相加,没有则插进去