2016-11-11 40 views
0

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

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++; 
      } 
     } 

    } 

任何帮助,将不胜感激

非常感谢

- 罗斯

回答

1

它并不明显,其中连接和CONNECT2分配,但基于它不听起来像CONNECT2异常上是一个开放的连接。

你应该能够重用第一个连接对象,我认为这会更明智。

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

正如在其他评论中提到另一种明智的策略是使一个电话,就在SQL的加入,因为它是善于发现和数据库调用是相对昂贵的(你正在一个的每次迭代外部循环在你的实现中)。

保持它们分离使得SQL更加可重用,因此它确实取决于您的要求以及您处理的数据量。

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),你不会想输出一行为每首歌曲在专辑中;通过任一专辑或艺术家分组将使最有意义的,当然...

+0

这是评论。 – mybirthname

+0

@mybirthname不,这是帕特里克。 – CodeCaster

0

试试这个:

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