目前我正在尝试为我正在开发的音乐播放器动态生成一些按钮,我正在尝试从音乐标签中检索专辑封面,以便可以将其添加为按钮的背景图像。我目前的做法是有两个读者,一个选择有关专辑的所有信息,另一个从歌曲数据库中取出专辑中歌曲的目录位置,以便我可以使用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++;
}
}
}
非常感谢任何帮助
非常感谢
- 罗斯
答案 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()))
{
///...
}