gpt4 book ai didi

c# - 与 Microsoft Enterprise Library 共享 MySQL 连接

转载 作者:行者123 更新时间:2023-11-29 11:29:20 26 4
gpt4 key购买 nike

我的设置是 MySql.Data.MySqlClient v6.9.8.0Microsoft.Practices.EnterpriseLibrary.Data v6.0.0

该程序是一个长时间运行的程序,它连续运行监听任务,然后使用某种形式的数据库操作来执行作业(取决于请求是什么。)有时请求会一个接一个,有时会出现他们之间有几个小时。

我尝试在连接字符串中使用Pooling=true,但它给我带来了很多问题(并非总是如此 - 这些是间歇性问题。)

这是一个例子:

[MySqlException (0x80004005): Authentication to host 'localhost' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.]

关闭可以解决该问题,但同时也会使查询变慢,因为我们无法重用连接。我在网上搜索过,很多人都有同样的问题,我发现的唯一修复/解决方法是 Pooling=false ,如果可能的话我宁愿避免。

这是我的查询代码的示例:

Database db = this.GetDatabase(databaseName);

List<dynamic> results = new List<dynamic>();

// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{

foreach (var parameter in inParameters)
{
db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}

foreach (var parameter in outParameters)
{
db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}

using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
IDictionary<string, object> instance;

do
{
// Read each row
while (dataReader.Read())
{
instance = new ExpandoObject() as IDictionary<string, object>;

// Populate the object on the fly with the data
for (int i = 0; i < dataReader.FieldCount; i++)
{
instance.Add(dataReader.GetName(i), dataReader[i]);
}

// Add the object to the results list
results.Add(instance);
}
} while (dataReader.NextResult());
}

return results;
}

有什么想法吗?

最佳答案

你能试试这个吗?我知道我知道。使用“using”应该意味着我不必调用 dataReader.Close() 方法......但我仍然这样做。我还稍微修改了 dr.Read block 。

这个人谈论它。

http://www.joseguay.com/uncategorized/ensure-proper-closure-disposal-of-a-datareader

我知道,我知道。你不应该这样做。即使使用 Ent 库,我也会执行额外的 .Close 步骤来尝试并确保。

Database db = this.GetDatabase(databaseName);

List<dynamic> results = new List<dynamic>();

// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{

foreach (var parameter in inParameters)
{
db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}

foreach (var parameter in outParameters)
{
db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}

using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
IDictionary<string, object> instance;

while (dataReader.Read())
{
instance = new ExpandoObject() as IDictionary<string, object>;

// Populate the object on the fly with the data
for (int i = 0; i < dataReader.FieldCount; i++)
{
instance.Add(dataReader.GetName(i), dataReader[i]);
}

// Add the object to the results list
results.Add(instance);
}

if (dataReader != null)
{
try
{
dataReader.Close();
}
catch { }
}

}

return results;
}

关于c# - 与 Microsoft Enterprise Library 共享 MySQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37676142/

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