2011-03-27 56 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#,所以我給信貸第一海報。