Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySQL-多结果集_C#_.net_Mysql - Fatal编程技术网

C# MySQL-多结果集

C# MySQL-多结果集,c#,.net,mysql,C#,.net,Mysql,我正在使用.NET连接器连接到MySQL。 在我的应用程序中,很少有线程使用相同的连接,因此,如果MySQLDataReader尚未关闭,而某些线程正在尝试执行查询,则会出现以下错误: 已存在与此连接关联的打开的DataReader,必须先关闭该连接 MySQL中会支持多个结果集吗?或者不管它叫什么 我的数据库管理类: public class DatabaseConnection { private MySqlConnection conn; public void Conn

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

已存在与此连接关联的打开的DataReader,必须先关闭该连接

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();
    }
}
多个结果集是指返回多个行集的单个查询或查询批处理。这些结果通过该连接的唯一数据读取器访问

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


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

我不会说这是由于MySQL造成的。看起来更像是MySQLDataReader控件的限制。如果MySQL支持此功能,我可以在他们的网站上找到此功能..:\你能发布你的代码吗?它非常大,并且分成了很多文件,但是我会发布我的数据库管理类(我正在编辑这篇文章)。
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)
}