好的世界,我遇到了一些麻烦。不,这不是“功课”DataReader不返回行 - 数据库中存在行
我有一些代码,需要做两件事情:
1)从数据库
2阅读艺术家列表)查找该艺术家和存储写入所有曲目它为后来
我在做什么:
1)SELECT ArtistID FROM artists
让我的艺术家名单。我建立起来的List<string>
数据类型,使用DataReader
等伟大工程
2)SELECT count(*) as track_numbers from tracks WHERE ArtistID = @ArtistID
不起作用那么大
我的问题:
第二个SELECT语句会成功,如果我手动指定ArtistID
(即:SELECT count(*) as track_numbers FROM Tracks WHERE ArtistID = 0
工程),但如果我遍历我的列表,它将始终返回零结果。
我使用连接器/净6.3.6,的Visual Studio 2010(所有更新),.NET 4.0客户端配置文件,MySQL社区服务器5.5.9 64,Windows 7家庭高级版64位
我曾尝试:
- 使用字符串连接来建立我的查询字符串与artistid
- 铸造artistid作为一个字符串,然后一个int,则反之亦然
- 重新布置,其中各参数的定义,放于值,该命令文本
相关(我认为)以下代码:
List<string> list = new List<string>();
Hashtable table = new Hashtable();
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName);
using (DbConnection conn = factory.CreateConnection())
{
conn.ConnectionString = setting.ConnectionString;
conn.Open();
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ArtistID FROM artists;";
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(reader["ArtistID"].ToString()); //this works, and I can iterate no problem through this list
}
}
}
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT count(*) as counts FROM tracks WHERE ArtistID = @ArtistID;";
//cmd.CommandText = "SELECT count(*) as counts FROM tracks WHERE ArtistID = 0;"; <-- this line works
DbParameter param = cmd.CreateParameter();
param.ParameterName = "@ArtistID";
foreach (string artist in list)
{
param.Value = artist;
cmd.Parameters.Add(param);
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(artist + "\t" + reader["counts"]); //reader["counts"] is always '0'
}
cmd.Parameters.Clear();
}
}
}
}
数据库表的格式是: 艺术家具有一个值/键称为ArtistID
,类型int
首 曲目有三列,TrackID (int, pk)
,artistid (int)
,albumid(int)
有什么建议?谢谢。
您可以在启动循环之前检查'HasRows'属性吗?并查看数据源中的检索是否实际工作或出错。 – 2011-03-27 22:27:00