gpt4 book ai didi

c# - SqlCommand.ExecuteReader 是否会自动打开数据库连接?

转载 作者:行者123 更新时间:2023-11-28 21:17:10 26 4
gpt4 key购买 nike

我注意到我的网页上有一些奇怪的行为。我有一个 WCF 数据服务,它提供 JSON 来填充 jqGrid。使用 javascript/ajax 调用该服务。

然后我有一些服务器端代码也调用相同的 WCF 服务来获取数据。

在我的 WCF 服务中,我在没有事先打开连接的情况下运行 cmd.ExecuteReader(),并且在某些情况下它不会提示连接 - 似乎是在我从 javascript 调用数据服务时。但是,当我从代码隐藏(即服务器端)调用该服务时,我收到错误消息“ExecuteReader 需要一个打开且可用的连接”。

有人知道这个问题吗?我已经尽可能缩小范围了。看来唯一的区别是我是从客户端还是从服务器端调用服务。这是我的代码:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class JsonService
{
static String _connection = ConfigMgr.ConnectionStrings["MyConnStr"];
static DomainEntities dbContext = new DomainEntities(_connection);

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public JsonGrid Get()
{
return new JsonGridContract(dbContext.Products.ToJson());
}
}

下面是调用 ExecuteReader() 的地方。它拦截提供程序,将表达式树转换为 SQL,然后执行它,将结果解析为基于字符串的 JSON,而不是域对象。

    public static List<JsonRow> ToJson(this IQueryable queryable)
{
Expression expression = queryable.Expression;
expression = Evaluator.PartialEval(expression);

if !(queryable.Provider is JsonQueryProvider)
throw new InvalidOperationException("Provider is invalid");

String table = (queryable.Provider as JsonQueryProvider).Table;

SqlConnection connection = (queryable.Provider as JsonQueryProvider).Connection;

Type elementType = TypeSystem.GetElementType(expression.Type);

TranslateResult result = new QueryTranslator(table).Translate(expression);

SqlCommand cmd = connection.CreateCommand();

cmd.CommandText = result.CommandText;

SqlDataReader reader = cmd.ExecuteReader();

List<JsonRow> jsonResult = new List<JsonRow>();

while (reader.Read())
{
JsonRow instance = new JsonRow(reader.FieldCount);

for (int i = 0, n = reader.FieldCount; i < n; i++)
{
var items = instance.Items;

if (reader.IsDBNull(i))
{
items[i] = string.Empty;
}
else
{
items[i] = reader[i].ToString();
}
}

jsonResult.Add(instance);
}

reader.Close();

return jsonResult;
}

如前所述,即使我从未打开连接,此方法也可以正常执行。我正在使用 AJAX 客户端,

  $.ajax(
{
type: "POST",
contentType: "application/json; charset=utf-8",
url: "Services/JsonService.svc/Get",
data: {},
dataType: "json",
success: function (data, textStatus) {
if (textStatus == "success") {
var thegrid = $("#jqGrid")[0];
thegrid.addJSONData(data.d);
}
},
error: function (data, textStatus) {
alert('An error has occured retrieving data.');
}
});
}

最佳答案

首先要排除的是,您不要处置任何对象。您的 SqlCommand、SqlConnection 和 SqlDataReader 都应该使用 stmt block 。那么你不需要明确的关闭。看看这是否会全面失败。我很好奇是否只是垃圾收集器尚未收集来杀死您的连接对象。

using(SqlConnection connection = new SqlConnection(...))
{
...
}

关于c# - SqlCommand.ExecuteReader 是否会自动打开数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7274731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com