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