【问题标题】:Using two readers one nested inside the other使用两个阅读器,一个嵌套在另一个内部
【发布时间】:2016-11-11 12:44:06
【问题描述】:

目前我正在尝试为我正在开发的音乐播放器动态生成一些按钮,并且我目前正在尝试从音乐标签中检索专辑封面,以便可以将其添加为按钮的背景图像。我目前这样做的方法是有两个阅读器,一个选择有关专辑的所有信息,另一个从歌曲数据库中获取专辑中歌曲的目录位置,以便我可以使用 taglib 获取专辑封面信息和将其转换为 System.Drawing.Image。但是要做到这一点,我使用的是嵌套在阅读器中的阅读器,我似乎无法让嵌套阅读器的连接正常工作。目前,我为每个阅读器/命令使用两个连接,一个称为 connection,一个称为 connection2,两者都具有相同的连接字符串:

server=localhost; port=3306; userid=KEVIN; password=; database=kevin;

但是,当我运行下面的代码时,我得到了这个错误:

public void createAlbumButtons(int x, FlowLayoutPanel field)
    {
        MySqlCommand selectAlbumsTable = new MySqlCommand("SELECT * FROM Albums ORDER BY Artist ASC, Album DESC", connect);
        MySqlDataReader readAlbumsTable = selectAlbumsTable.ExecuteReader();
        while (readAlbumsTable.Read())
        {
            MySqlCommand selectAlbumIDFromFirstSong = new MySqlCommand("SELECT SongLocation FROM Music Where AlbumID= \"" + readAlbumsTable.GetString(0) + "\" LIMIT 1", connect2);
            MySqlDataReader readAlbumIDFromFirstSong = selectAlbumIDFromFirstSong.ExecuteReader();
            while (readAlbumIDFromFirstSong.Read())
            {
                string temp = readAlbumIDFromFirstSong.GetString(0).Replace("\\\"", "\\");
                TagLib.File findAlbumArt = TagLib.File.Create(temp);
                MemoryStream memstrm;
                try
                {
                    memstrm = new MemoryStream(findAlbumArt.Tag.Pictures[0].Data.Data);
                    albumCoverImage = System.Drawing.Image.FromStream(memstrm);
                }
                catch
                {
                    albumCoverImage = KEVIN.Properties.Resources.NoAlbumArt;

                }
                field.Controls.Add(AttachMethodToButton(new Button
                {
                    Name = "Album" + readAlbumsTable.GetString(0),
                    ForeColor = Color.WhiteSmoke,
                    Text = readAlbumsTable.GetString(1) + "\n" + readAlbumsTable.GetString(2),
                    TextAlign = ContentAlignment.BottomCenter,
                    Size = new Size(130, 130),
                    BackgroundImage = albumCoverImage,
                    BackgroundImageLayout = ImageLayout.Zoom,
                    FlatStyle = FlatStyle.Flat,
                    FlatAppearance =
                    {
                        BorderSize = 1,
                        BorderColor = ColorTranslator.FromHtml("#444444"),
                    },
                }, () => openAlbumForm()));
                x++;
            }
        }

    }

任何帮助将不胜感激

非常感谢

- 罗斯

【问题讨论】:

    标签: c# mysql winforms nested


    【解决方案1】:

    connect 和 connect2 的分配位置并不明显,但根据异常,它听起来不像 connect2 是一个打开的连接。

    您应该能够重用我认为更明智的第一个连接对象。

    MySqlCommand selectAlbumIDFromFirstSong = new MySqlCommand("SELECT SongLocation FROM Music Where AlbumID= \"" + readAlbumsTable.GetString(0) + "\" LIMIT 1", connect);
    

    正如在其他 cmets 中提到的,另一种明智的策略是进行一次调用并在 SQL 中进行连接,因为它擅长此操作并且 db 调用相对昂贵(您为您的外部循环的每次迭代都进行一个实施)。

    将它们分开使 SQL 更易于重用,因此它实际上取决于您的要求以及您要处理的数据量。

    【讨论】:

      【解决方案2】:

      我猜您的第二个命令无法打开数据库连接,因为第一个命令仍在使用它;老实说,我认为您在这里试图解决错误的问题。您应该将两个查询组合成一个语句;在您发布的示例中无需使用嵌套查询。而不是

      SELECT * FROM Albums ORDER BY Artist ASC, Album DESC
      SELECT SongLocation FROM Music Where AlbumID = @albumId
      

      试试这个:

      SELECT     m.SongLocation
      FROM       Music m
      INNER JOIN Albums a ON m.AlbumId = a.AlbumId
      ORDER BY   a.Artist ASC, a.Album DESC
      

      您可能还想考虑使用 GROUP BY 子句(例如 GROUP BY a.AlbumId),因为您不想为专辑中的每首歌曲输出一行;当然,按专辑或艺术家分组最有意义...

      【讨论】:

      • 这是评论。
      【解决方案3】:

      试试这个:

      using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
      using (StreamReader expFile = new StreamReader(expectedFile.OpenRead())) 
      {
          ///...
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2015-12-25
        相关资源
        最近更新 更多