4

リモートおよびローカル MySQL データベースへのデータベース クエリを処理するカスタム クラスを作成しましたが、ネストされたループを実行すると、次のエラーが表示されます。

MySql.Data.MySqlClient.MySqlException was unhandled
Message=There is already an open DataReader associated with this Connection which must be closed first.
Source=MySql.Data
ErrorCode=-2147467259
Number=0

私のクラスは現在このようになっています

public class MySQLManager
{
    private MySqlConnection _MySQLRemoteConnection { get; set; }
    public void setup(string remoteUser, string remotePass, string remoteServerAddress, string remoteDb, string localUser, string localPass, string localServerAddress, string localDb)
    {
        _remote_server_address = remoteServerAddress;
        _remote_database = remoteDb;
        _remote_username = remoteUser;
        _remote_password = remotePass;    
    }
    public void connect()
    {
        try
        {
            _MySQLRemoteConnection = new MySqlConnection() { ConnectionString = string.Format("server={0};database={1};uid={2};password={3};", _remote_server_address, _remote_database, _remote_username, _remote_password) };
            _MySQLRemoteConnection.Open();
            _RemoteConnection = true;
        }
        catch (MySqlException ex)
        {
            _RemoteConnection = false;
        }
    }
    public MySqlCommand run(string query, List<MySqlParameter> dbparams = null)
    {
        connect();

        MySqlCommand sql = getConnection().CreateCommand();
        sql.CommandText = query;
        if (dbparams != null)
        {
            if (dbparams.Count > 0)
            {
                sql.Parameters.AddRange(dbparams.ToArray());
            }
        }
        //disconnect();
        return sql;
    }
    public MySqlDataReader fetch(MySqlCommand cmd)
    {
        //connect();
        var t = cmd.ExecuteReader();
        //disconnect();
        return t;
    }

そして、エラーを作成するために実行しているコードは、以下の例を単一のクエリで実行できることを理解しています。これは、エラーを再作成するためのサンプルクエリです。単一のクエリに書き込むと、ライブ例。

query = "SELECT field1 FROM tmp WHERE field1 < 3";
            using (var sql = db.run(query))
            {
                txtResponse.Text += "Query ran" + nl;
                using (var row = db.fetch(sql))
                {
                    txtResponse.Text += "Query fetched" + nl;

                    db.connect();
                    while (row.Read())
                    {
                        txtResponse.Text += "Row : " + row[0].ToString() + nl;
                        query = "SELECT val1 FROM tmp2 WHERE field1 = '" + row[0].ToString() + "'";
                        //db.disconnect();
                        using (var sql2 = db.run(query))
                        {
                            txtResponse.Text += "Query ran" + nl;
                            db.disconnect();
                            using (var row2 = db.fetch(sql))
                            {
                                txtResponse.Text += "Query fetched" + nl;
                                db.connect();
                                while (row.Read())
                                {
                                    txtResponse.Text += "        Val : " + row2[0].ToString() + nl;
                                }
                            }
                        }
                    }
                }
            }

では、2 番目のループを機能させるにはどうすればよいでしょうか。

4

1 に答える 1

1

SQL Serverの場合、接続文字列でMultipleActiveResultSets = trueを使用できますが、これはMySQLでは機能しない可能性があります。

もう1つのオプションは、データリーダーごとに1つずつ、合計2つの接続を使用することです。

于 2012-06-22T12:12:55.930 に答える