c# - DataReader 不返回任何行——行存在于数据库中

标签 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 语句将会成功(即:SELECT count(*) as track_numbers FROM Tracks WHERE ArtistID = 0 有效)但如果我遍历我的列表,它将始终返回零结果。

我正在使用 Connector/Net 6.3.6Visual Studio 2010(所有更新)、.NET 4.0 Client ProfileMySQL 社区服务器 5.5.9 x64Windows 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)

有什么建议吗?谢谢。

最佳答案

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

关于c# - DataReader 不返回任何行——行存在于数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452872/

相关文章:

c# - C# 中哪些操作是原子操作?

c# - 什么分类算法最适合对法律文档图片进行分类?

c# - URL WebRequest 404 错误 RESTful 服务中的百分比编码

来自 .net 客户端的 java web 服务

.net - 针对移动设备和桌面设备进行开发

mysql - SQLite - 从表中检索名称集

MySQL计算多个列/表的最大值

php - MySQL/PHP - 按名称排序,除非是新的

c# - 如何检查对象是否已在 C# 中释放

c# - Nhibernate GetById 返回 ObjectNotFoundException insetad of null