gpt4 book ai didi

c# - MySQL - 多个结果集

转载 作者:行者123 更新时间:2023-11-29 02:07:33 31 4
gpt4 key购买 nike

我正在使用 .NET 连接器连接到 MySQL。在我的应用程序中,很少有线程使用相同的连接,因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询,则会出现该错误:

There is already an open DataReader associated with this Connection which must be closed first.

MySQL 是否会支持多结果集或不管它叫什么?

我的数据库管理类:

public class DatabaseConnection
{
private MySqlConnection conn;

public void Connect(string server, string user, string password, string database, int port = 3306)
{
string connStr = String.Format("server={0};user={1};database={2};port={3};password={4};charset=utf8",
server, user, database, port, password);
conn = new MySqlConnection(connStr);
conn.Open();
}

private MySqlCommand PrepareQuery(string query, object[] args)
{
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
for (int i = 0; i < args.Length; i++)
{
string param = "{" + i + "}";
string paramName = "@DBVar_" + i;
query = query.Replace(param, paramName);
cmd.Parameters.AddWithValue(paramName, args[i]);
}
cmd.CommandText = query;
return cmd;
}

public List<Dictionary<string, object>> Query(string query, params object[] args)
{
MySqlCommand cmd = PrepareQuery(query, args);
MySqlDataReader reader = cmd.ExecuteReader();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
while (reader.Read())
{
Dictionary<string, object> row = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
row.Add(reader.GetName(i), reader.GetValue(i));
}
rows.Add(row);
}
reader.Close();
return rows;
}

public object ScalarQuery(string query, params object[] args)
{
MySqlCommand cmd = PrepareQuery(query, args);
return cmd.ExecuteScalar();
}

public void Execute(string query, params object[] args)
{
MySqlCommand cmd = PrepareQuery(query, args);
cmd.ExecuteNonQuery();
}

public void Close()
{
conn.Close();
}
}

我如何使用它的示例:

DatabaseConnection Conn = new DatabaseConnection();
Conn.Connect("localhost", "root", "", "foogle");
var rows = conn.Query("SELECT * FROM `posts` WHERE `id` = {0}", postID);
foreach (var row in rows)
{
Console.WriteLine(row["title"]); // Writes the post's title (example)
}

最佳答案

多个结果集是指单个查询或查询批处理返回多个行集。这些结果是通过该连接的唯一 DataReader 访问的。

您要的是完全不同的东西。您需要能够对单个连接执行多个同时查询。 Afaik .NET 不支持它,不适用于 SQL Server 或任何其他驱动程序。

在多个线程之间共享一个连接是一个坏主意,而且完全没有必要。 .NET 将使用连接池来限制连接总数,因此为要执行的每个(组)查询获取新连接是绝对安全的。将连接范围限制为线程,您的问题就会消失。

关于c# - MySQL - 多个结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321879/

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