2011-03-27 31 views
4

好的世界,我遇到了一些麻烦。不,这不是“功课”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 64Windows 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)

有什么建议?谢谢。

+0

您可以在启动循环之前检查'HasRows'属性吗?并查看数据源中的检索是否实际工作或出错。 – 2011-03-27 22:27:00

回答

0

我认为你需要删除cmd.Parameters.Add(param);调用。这为每次迭代添加了一个新参数。只需为每个现有参数设置参数值就足够了。

0
foreach (string artist in list) 
{ 
    param.Value = artist; 
    cmd.Parameters.Add(param) 

您正在重新添加参数每一个艺术家 - 我很惊讶,这在所有工作,当然它不应该为SqlParameter - 如果DbParameter以同样的方式,它应该是这样的:

cmd.Parameters.Add(param); 
foreach (string artist in list) 
{ 
    param.Value = artist; 
0

砸我的头靠在墙上一个小时后,我发现这个问题: 1)我需要做一个“干净的解决方案”的原因,我无法捉摸 2)不知何故,外键关系,确保有实际上是与artistid中的artistid相匹配的轨道中的artistid我不知何故设法搞砸了

我其实是一个巨大的白痴。

以上的答案,而不是他们并没有解决我的问题,没有教我一些新的关于C#,所以我给信贷第一海报。