DataReader не возвращает строк - строки присутствуют в базе данных - PullRequest
4 голосов
/ 28 марта 2011

Хорошо, мир, у меня проблемы. Нет, это не домашнее задание

У меня есть код, который должен сделать две вещи:
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 работает), но если я перебираю свой список, он всегда будет возвращать ноль результатов.

Я использую Connector / Net 6.3.6 , Visual Studio 2010 (все обновления), .NET 4.0 Профиль клиента , MySQL Community Сервер 5.5.9 x64 , Windows 7 Home Premium 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 голосов
/ 28 марта 2011
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 голосов
/ 28 марта 2011

После того, как я еще час разбил голову о стену, я обнаружил проблему: 1) Мне нужно было сделать «чистое решение» по причинам, которые я не могу понять 2) Каким-то образом отношения между ключевыми ключами гарантировали, что в треках действительно был артистид, который соответствовал артистизму в артистах, которые мне каким-то образом удалось испортить

Я на самом деле огромный идиот.

Приведенные выше ответы не помогли решить мою проблему, но научили меня чему-то новому в c #, поэтому я отдаю должное 1-му постеру.

0 голосов
/ 28 марта 2011

Я думаю, вам нужно удалить вызов cmd.Parameters.Add(param);.Это добавляет новый параметр на каждой итерации.Достаточно просто установить значение параметра каждый раз для существующего параметра.

...