zoukankan      html  css  js  c++  java
  • delphi xe -芒果数据库(FDConnection,DataSource,FDMongoQuery,FDMongoDataSet)连接,查询(展示数据),这里有mongodb为例子

    一、连接

    1、FDConnection:创建一个临时连接定义

    资料:http://www.cnblogs.com/zhenfei/p/4105515.html

    连接芒果数据库:选则Mongo(芒果),服务器地址。

    2、FDMongoQuery:与数据库、表关联,并与上面的Connection连接。

    直接选择连接

      代码连接

     

    FDMongoQuery1.Close;
    FDMongoQuery1.FieldDefs.Clear;

    // Setup new connection
    FDMongoQuery1.DatabaseName := EditDatabase.Text;
    FDMongoQuery1.CollectionName := EditCollection.Text;
    FDMongoQuery1.QMatch := EditMatch.Text;//查询条件
    FDMongoQuery1.QSort := EditSort.Text;//排序
    FDMongoQuery1.QProject := EditProjection.Text;//显示字段(0不显示,1显示)
    dsQuery.DataSet := FDMongoQuery1;
    FDMongoQuery1.Open;

    FDMongoQuery1.FieldDefs.Count;//最外层字段个数

    FDMongoQuery1.FindField("grades") != NULL//找到某字段

    FDMongoGQ_devch.QProject:='{"name":1}';//要显示的字段

       FDMongoGQ_devch.QProject:='{"vdev.channels.2":0,"vdev.channels.32dplqsx":0}';//不要显示整个内嵌

    FDMongoGQ_devch.FindField('_id').Visible:=False;//隐藏不需要显示的字段

    例子:

    procedure TFrm_0201_dev.ds_CHSDataChange(Sender: TObject; Field: TField);
    var
      sdev,sch,styep:string;
    begin
      if(dbgrd_ch.DataSource.DataSet.FieldByName('_id').Value<>null) then
      begin
        sdev:=dbgrd_ch.DataSource.DataSet.FieldByName('dev').Value;
        sch:=dbgrd_ch.DataSource.DataSet.FieldByName('ch').Value;
        styep:=dbgrd_dev.DataSource.DataSet.FieldByName('type').Value;
        if(styep='VIRTUAL')then
        begin
          FDMongoGQ_devch.Close;
          FDMongoGQ_devch.Query.Options.Explain := False;
          FDMongoGQ_devch.FieldDefs.Clear;

          FDMongoGQ_devch.QMatch:='{"dev":'''+sdev+'''}';
          FDMongoGQ_devch.QProject:='{"vdev.channels.'+sch+'.inputs" :1,"vdev.channels.'+sch+'.unit":1}';
          ds_devch.DataSet := FDMongoGQ_devch;
          FDMongoGQ_devch.Open;
          FDMongoGQ_devch.FindField('_id').Visible:=False;
          FDMongoGQ_devch.FindField('vdev').Visible:=False;
          FDMongoGQ_devch.FindField('vdev.channels').Visible:=False;
          FDMongoGQ_devch.FindField('vdev.channels.'+sch+'').Visible:=False;
        end;

      end

      else Exit;
    end;

    二、批量修改,最后统一保存

    cachedUpdates :true;//试过可以

    3、DataSource:数据源控件用于数据集控件和数据显示控件的链接作用,比如grid 等一些数据显示控件都有 datasource 属性。

     

    4、将grid与datasource连接就可以了。

    5、为空时:if(FDMongoGQ_phdev.IsEmpty and (FDMongoGQ_phdev.FieldDefList.Count = 1)) then exit;

     

     二、查询

    1、一个grid查询

    procedure TFrm_0201_dev.Act_QueryExecute(Sender: TObject);
    var
    q:TMongoWireQuery;
    d:IJSONDocument;
    i:Integer;
    begin
      BuildQuery;
      FDMongoQuery1.Open;

    end;

    procedure TFrm_0201_dev.BuildQuery;
    var
    scondition :string;
    begin
      if(Trim(edt_dev.Text)<>'') then
       scondition:=' {"dev" :{$regex:'+''''+edt_dev.Text+''''+'}}'//正则表达式:进行模糊查询
      FDMongoQuery1.Close;
      FDMongoQuery1.Query.Options.Explain := False;
      FDMongoQuery1.FieldDefs.Clear;

      FDMongoQuery1.QMatch := scondition;
    end;

    2、两个grid联动

    procedure TFrm_0201_dev.DataSourceDataChange(Sender: TObject; Field: TField);
    var
    DataSetField: TDataSetField;
    begin
      BuildQuery1;
      FDMongoQuery2.Open;

      if(FDMongoQuery2.FindField('tags') <>nil) then
      begin
        DataSetField :=FDMongoQuery2.FieldByName('tags') as TDataSetField;//这个是数据集,后面会讲到,用来展示数组
        ds_tags.DataSet := DataSetField.NestedDataSet;
      end;
    end;

    procedure TFrm_0201_dev.BuildQuery1;
    var
    scondition:string;
    begin
      sID:= DBGrid1.DataSource.DataSet.FieldByName('_id').Value ;
      FDMongoQuery2.Close;
      FDMongoQuery2.Query.Options.Explain := False;
      FDMongoQuery2.FieldDefs.Clear;

      FDMongoQuery2.QMatch:='{"dev":'''+sID+'''}';//查询条件
      DataSource1.DataSet := FDMongoQuery2;
    end;

    3、芒果数据库里,数组的展示,用到TDataSetField

    网上的图

    自己的例子,如tags数组

    procedure TFrm_0201_dev.DataSourceDataChange(Sender: TObject; Field: TField);
    var
    DataSetField: TDataSetField;
    begin
    BuildQuery1;
    FDMongoQuery2.Open;

      if(FDMongoQuery2.FindField('tags') <>nil) then
      begin
        DataSetField :=FDMongoQuery2.FieldByName('tags') as TDataSetField;
        ds_tags.DataSet := DataSetField.NestedDataSet;
      end;
    end;

  • 相关阅读:
    graalvm 内置require 模块的开启
    Calling out from Java to JavaScript (with call back) – leveraging interoperability support of GraalVM
    web开发 api 资源跨域的一种实践
    使用rollup 转换commonjs 模块为es6 模块,方便的支持graalvm 模块兼容
    使用json-mask 查询json 数据
    nginx njs docker 试用
    使用nginx-prometheus-exporter 监控nginx
    wso2 关于graphql 的方案
    docker也一直发展
    操作系统-容器-Docker:如何将应用打包成为 Docker 镜像?
  • 原文地址:https://www.cnblogs.com/michellexiaoqi/p/7515213.html
Copyright © 2011-2022 走看看