You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FireDAC操作MongoDB插入数据时遇访问冲突及流读取错误求助

使用Delphi FireDAC操作MongoDB时出现访问冲突及流读取错误

我正在使用Delphi的FireDAC对MongoDB执行CRUD操作,参考了官方示例但无法正常运行,出现access violation(访问冲突)错误,随后又出现stream read error(流读取错误)。以下是我的代码:

var
  fdCon : TFDConnection;
  fdMongQuery : TFDMongoQuery;
  mDoc : TMongoDocument;
begin
try

  fdCon := TFDConnection.Create(nil);
  fdMongQuery := TFDMongoQuery.Create(nil);
  try
    fdCon.Params.Clear;
    fdCon.Params.DriverID := 'Mongo';
    fdCon.Params.Add('Server=' + 'localhost');
    fdCon.Params.Add('Port=' + '27017');

    fdCon.Open;

    fdMongQuery.Close;
    fdMongQuery.FieldDefs.Clear;
    fdMongQuery.FormatOptions.StrsTrim2Len := True;
    fdMongQuery.Connection := fdCon;
    fdMongQuery.DatabaseName := 'HR';
    fdMongQuery.CollectionName := 'employee';

    mDoc :=
      TMongoDocument.Create(TMongoEnv(fdCon))
          .Add('name', 'ago')
          .Add('age', 12)
          .Add('address', 'PH')
          ;

    fdMongQuery.Collection.Insert(mDoc); // access violation > stream read error
    mDoc.Free;

  finally
    fdMongQuery.Free;
    fdCon.Free;
  end;

except
end;
end;

请问问题出在哪里?


问题分析及解决方案

核心问题

  • TFDMongoQuery未激活初始化:在访问fdMongQuery.Collection前,必须先调用fdMongQuery.Open激活Query,否则Collection属性指向无效内存,直接调用Insert会触发访问冲突。
  • TMongoDocument创建方式错误:直接强制转换TFDConnection为TMongoEnv不合法,需通过FDConnection的MongoEnv属性获取正确的环境实例。
  • 空异常块:错误被完全吞掉,无法定位具体问题,建议添加错误输出逻辑。

修正后的代码

var
  fdCon : TFDConnection;
  fdMongQuery : TFDMongoQuery;
  mDoc : TMongoDocument;
begin
  fdCon := TFDConnection.Create(nil);
  fdMongQuery := TFDMongoQuery.Create(nil);
  try
    fdCon.Params.Clear;
    fdCon.Params.DriverID := 'Mongo';
    fdCon.Params.Add('Server=localhost');
    fdCon.Params.Add('Port=27017');
    fdCon.Open;

    fdMongQuery.Connection := fdCon;
    fdMongQuery.DatabaseName := 'HR';
    fdMongQuery.CollectionName := 'employee';
    // 必须先Open激活Query,初始化Collection对象
    fdMongQuery.Open;

    // 通过FDConnection的MongoEnv属性获取合法实例
    mDoc := TMongoDocument.Create(fdCon.MongoEnv)
        .Add('name', 'ago')
        .Add('age', 12)
        .Add('address', 'PH');

    fdMongQuery.Collection.Insert(mDoc);
    mDoc.Free;

    ShowMessage('数据插入成功');
  except
    on E: Exception do
      ShowMessage('错误:' + E.Message);
  end;
  fdMongQuery.Free;
  fdCon.Free;
end;

额外注意事项

  • 确保MongoDB服务在localhost:27017正常运行,HR数据库和employee集合不存在时,FireDAC会自动创建。
  • 未激活的TFDMongoQuery无需调用Close或修改FieldDefs,这些操作会干扰初始化流程。

内容的提问来源于stack exchange,提问作者Ago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:12