【问题标题】:MySQL - Multiple result setsMySQL - 多个结果集
【发布时间】:2010-07-23 19:54:55
【问题描述】:

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

已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。

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)
}

【问题讨论】:

  • 我不会说这是由于 MySQL。看起来更像是 MySQLDataReader 控件的限制。
  • 如果 MySQL 支持这个,我可以在他们的网站上找到这个特性.. :\
  • 你能贴出你的代码吗?
  • 它非常庞大,并且分为很多文件,但我会发布我的数据库管理课程(我正在编辑帖子)。

标签: c# .net mysql


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 2014-05-25
    • 1970-01-01
    • 2013-04-15
    • 2011-06-17
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多