使用两个读者,一个嵌套在另一个

时间:2016-11-11 12:44:07

标签: c# mysql winforms nested

目前我正在尝试为我正在开发的音乐播放器动态生成一些按钮,我正在尝试从音乐标签中检索专辑封面,以便可以将其添加为按钮的背景图像。我目前的做法是有两个读者,一个选择有关专辑的所有信息,另一个从歌曲数据库中取出专辑中歌曲的目录位置,以便我可以使用taglib获取专辑封面艺术信息和将其转换为System.Drawing.Image。然而,为了做到这一点,我使用嵌套在阅读器内的阅读器,我似乎无法使嵌套阅读器的连接工作。目前我正在使用两个连接,每个读取器/命令一个称为连接,一个称为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++;
            }
        }

    }

非常感谢任何帮助

非常感谢

- 罗斯

3 个答案:

答案 0 :(得分:1)

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

你应该能够重用我认为更合理的第一个连接对象。

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

正如其他评论中所提到的,另一个合理的策略是进行单个调用并在SQL中进行连接,因为它很擅长并且db调用相对昂贵(你在为你的外循环的每次迭代创建一个)实现)。

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

答案 1 :(得分:0)

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

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),因为您不想为相册中的每首歌输出一行;无论是专辑还是艺术家分组都是最有意义的,当然......

答案 2 :(得分:0)

试试这个:

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