首页 > 解决方案 > 查询映射的 CustomObject 时出现 NullPointerException

问题描述

我有以下代码:

        ActiveModule resultObject = null;

        StringBuilder sqlStringBuilder = new StringBuilder();
        sqlStringBuilder.AppendLine("SELECT * FROM suite_activemodule as _module");
        sqlStringBuilder.AppendLine("WHERE CityID = @CityID AND BaseModuleID = @BaseModuleID");

        using (MySqlConnection connection = new MySqlConnection(ConnectionString))
        {
            var _resultList = connection.Query<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, ModuleID = moduleID }, null, true, null, null); //<- This is were I get the error...
            int listSize = _resultList.Count();
            if (_resultList != null && !_resultList.Count().Equals(0))
            {
                resultObject = _resultList.ToList().First();
                resultObject.Module = BaseModuleRepository.GetByID(resultObject.ModuleID);
            }
        }

查询本身工作正常,但一旦我尝试运行查询,我就会收到以下错误消息:

北 MySql.Data.MySqlClient.MySqlConnection.get_ServerThread()

北 MySql.Data.MySqlClient.MySqlConnection.Abort()

bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)

在 C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 1053 中的 Dapper.SqlMapper.ExecuteReaderWithFlagsFallback(IDbCommand cmd, Boolean wasClosed, CommandBehavior 行为)。

在 C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 1081 中找到 Dapper.SqlMapper.d__138`1.MoveNext()。

北 System.Collections.Generic.List 1..ctor(IEnumerable1 个集合)

bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)

C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 723 中的Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout, Nullable1 commandType)。

...Repository.GetByCityIDAndModuleID(Int64 cityID, Int64 moduleID)

...DeactivateModule(字符串模块ID)

但是我之前运行过多个这样的查询并且没有收到这个错误。这没有多大意义,因为没有任何使用过的东西真的是空的。

我已经通过 Visual Studio 进行了干净的构建和完整的重建。

有谁知道这个问题并知道如何解决它?

标签: c#mysqldapper

解决方案


正如评论中提到的,可以通过在调用 Query<>() 中分配“BaseModuleID”来修复 NullReferenceException,如下所示:

var _resultList = connection.Query<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, BaseModuleID = moduleID }, null, true, null, null);

另一个建议:您调用 _resultList.Count() 两次。如果您的查询返回大量结果,这可能会很昂贵。由于您只处理列表中的第一项,因此您可以在列表中使用 FirstOrDefault() 而不是 Count()。或者,更好的是,您可以像这样在 MySqlConnection 上使用 QueryFirstOrDefault<>() :

    ActiveModule resultObject = null;
    StringBuilder sqlStringBuilder = new StringBuilder();
    sqlStringBuilder.AppendLine("SELECT * FROM suite_activemodule as _module");
    sqlStringBuilder.AppendLine("WHERE CityID = @CityID AND BaseModuleID = @BaseModuleID");

    using (MySqlConnection connection = new MySqlConnection(ConnectionString))
    {
        resultObject = connection.QueryFirstOrDefault<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, BaseModuleID = moduleID });            
        if (resultObject != null)
        {
            resultObject.Module = BaseModuleRepository.GetByID(resultObject.ModuleID);
        }
    }

祝你好运!


推荐阅读