DataReader不返回任何行 - 数据库中存在行

时间:2011-03-27 22:18:47

标签: c# .net mysql ado.net datareader

好的世界,我遇到了一些麻烦。不,这不是'家庭作业'

我有一些代码需要做两件事:
1)从数据库中读取艺术家列表
2)查找该艺术家所写的所有曲目并将其存储起来以供日后使用

我在做什么:
1)SELECT ArtistID FROM artists获取我的艺术家名单。我用List<string>数据类型构建它,使用DataReader等。工作得很好 2)SELECT count(*) as track_numbers from tracks WHERE ArtistID = @ArtistID效果不是很好

我的问题
如果我手动指定ArtistID(即:SELECT count(*) as track_numbers FROM Tracks WHERE ArtistID = 0工作),第二个select语句将成功,但如果我在列表中迭代,它将始终返回零结果。

我正在使用 Connector / Net 6.3.6 Visual Studio 2010 (所有更新), .NET 4.0客户端配置文件 MySQL社区服务器5.5.9 x64 Windows 7家庭高级版x64

我试过了:

  • 使用字符串连接来使用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)

有什么建议吗?感谢。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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;

答案 2 :(得分:0)

将头撞到墙上一小时后,我发现了问题: 1)我需要做一个“清洁解决方案”,原因是我无法理解 2)不知何故,外键关系确保在曲目中实际上有一个艺术家与我在某种程度上设法搞砸的艺术家的艺术家相匹配

我其实是个白痴。

以上答案虽然不是他们没有解决我的问题,但确实教给我一些关于c#的新内容,所以我赞美第一张海报。