使用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
相关产品推荐
相关产品推荐

