1

私は自分のデータベースからいくつかを取得しようとしていますがdata、それぞれdataがいくつかを持っている可能性があるattributesため、私のロジックはすべてを取得しているdataMySqlDataReaderでした.idattributes

しかし、エラーが発生しました:「この接続に関連付けられた開いている DataReader が既に存在します」なので、MySqlDataReaderこの時点で同時に実行することはできないと思いattributesますdata

それらをリストに追加した後、各要素を循環さPluせる必要がありますか、それともより良い解決策がありますか?

dataこれが(Pluオブジェクト)を取得する関数です

        public IEnumerable<Plu> GetPlu(string piva, int menu)
        {
            string connectionString = $"CONSTR";
            using var connection = new MySqlConnection(connectionString);
            connection.Open();

            var sql = @"QUERY";

            using var cmd = new MySqlCommand(sql, connection);
            cmd.Parameters.AddWithValue("@menu", menu);
            cmd.Prepare();

            using MySqlDataReader reader = cmd.ExecuteReader();

            List<Plu> plu = new List<Plu>();

            while (reader.Read())
            {
                plu.Add(new Plu(
                    (int)reader["ID_PLUREP"],
                    (string)reader["CODICE_PRP"],
                    (string)reader["ESTESA_DES"],
                    (string)reader["DESCR_DES"], (float)reader["PRE_PRP"],
                    reader.IsDBNull(reader.GetOrdinal("IMG_IMG")) ? null : (string)reader["IMG_IMG"],
                    Attributi(connection, (int)reader["ID_PLUREP"])
                    ));
            }

            return plu; 
        }

attributesそして、これはfor eachの IEnumerable を返す関数 Attributi ですPlu

        public IEnumerable<Plu.Attributi> Attributi(MySqlConnection connection, int idplu)
        {
            var sql = @"QUERY";

            using var cmd = new MySqlCommand(sql, connection);
            cmd.Parameters.AddWithValue("@idplu", idplu);
            cmd.Prepare();

            List<Plu.Attributi> attributi = new List<Plu.Attributi>();

            using MySqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                attributi.Add(new Plu.Attributi(
                        reader.IsDBNull(reader.GetOrdinal("BCKCOL_ATT")) ? null : (string)reader["BCKCOL_ATT"],
                        reader.IsDBNull(reader.GetOrdinal("FORCOL_ATT")) ? null : (string)reader["FORCOL_ATT"],
                        reader.IsDBNull(reader.GetOrdinal("DESCR_ATT")) ? null : (string)reader["DESCR_ATT"]
                        ));
            }

            return null;
        }
4

2 に答える 2

0

より一般的なケースでは、私の経験MySQLから、読者を常に「解放」するようになりました。

MySqlDataReader reader = cmd.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);

次に、DataTableではなくから作業するMySqlDataReaderと、必要に応じて接続を再利用できます。

于 2020-05-25T08:47:53.857 に答える