繁体   English   中英

ExecuteReader:CommandText属性尚未初始化; 但页面加载正常吗?

[英]ExecuteReader: CommandText property has not been initialized; but the page loads just fine?

我有一个MVC设置,Controller的Index()方法对数据库启动查询,然后将其序列化为JSON并返回到View。 几乎每个控制器仅用于显示数据,因此有多种此类方法。 举个例子:

public string getSalesReport()
{
    return queryForJsonResult(ConfigurationManager.AppSettings["RetrieveSalesReport"]);
}

方法是否正在运行。 我传递给它的appSetting是查询(绝对正确)。 然后,此方法执行以下操作:

private string queryForJsonResult(string query)
{
    SqlConnection connection = new SqlConnection(_connectionString);
    connection.Open();

    SqlCommand command = new SqlCommand(query, connection);
    SqlDataReader result = command.ExecuteReader();

    string jsonResult = bufferedResultBuilder(result);

    connection.Close();

    return jsonResult;
}

private string bufferedResultBuilder(SqlDataReader result)
{
    // Takes a result set and uses a buffer to build a JSON string.
    StringWriter stringWriter = new StringWriter(new StringBuilder());
    JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter);
    jsonTextWriter.WriteStartArray();

    while (result.Read())
    {
        jsonTextWriter.WriteStartObject();
        for (int i = 0; i < result.FieldCount; i++)
        {
            jsonTextWriter.WritePropertyName(result.GetName(i));
            jsonTextWriter.WriteValue(result[i]);
        }

        jsonTextWriter.WriteEndObject();
    }

    jsonTextWriter.WriteEndArray();

    return stringWriter.ToString();
}

因此,它将获取结果集并从中构建一个JSON字符串,一次创建一个条目。 当我运行项目时,所有这些似乎都可以正常工作,数据已正确加载。 我也有单元测试,利用Stopwatch来测试这些Controller方法运行多长时间。 但是,当我运行单元测试时,此特定条目捕获了一个错误:

结果消息:测试方法Dashboard.Tests.BenchmarkTests.salesOverviewLoadTime抛出异常:System.InvalidOperationException:ExecuteReader:CommandText属性尚未初始化

该查询绝对是正确的,还有其他几个非常相似的示例,它们仅在输入的初始查询中有所不同。 所有这些方法都可以正常工作。 此错误的堆栈跟踪将其追溯到queryForJsonResult()SqlCommand.ExecuteReader() ,但是就像我说的那样,它仅针对用于显示视图的许多非常相似的方法之一执行此操作。

为什么在单元测试时实际上能正确加载数据的一个查询捕获错误? 单元测试的设置几乎完全相同,除了已加载的Controller以及所有其他测试都工作正常之外。

这对我来说仍然很奇怪。 正如@MichaelLiu指出的那样,我的.config文件没有相同的appSettings 我复制了包含查询的所有appSettings ,从而解决了该问题。 但是,这并不一定说明为什么所有其他查询都能正常工作。 我认为我在代码异常处理方式上可能存在一线差异,例如

try {} catch {return;}
return;

相对于

try {
    return;
} catch {
    return;
}

尽管return应该不会出错。

无论如何,解决方案是确保您的项目及其对应的单元测试都具有相同的.config规范。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM