[英]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.