2014-02-28 56 views
1

我正在做一個C#應用程序,即時通訊相當確定我的代碼是正確的,但即時通訊與SQL連接新。我的問題是,我有2個對象,其中A包含B並且正在執行查詢以獲取所有A行將它們添加到列表中,並且對於每一行我去搜索它的B並將它們添加到A.bList。在B查詢中,結果是A>。>這是怎麼回事?DataTable返回舊結果

如果有幫助。這兩個班是業主和狗 所以班主(Dono)有一個狗(曹)對象的列表。

public class dal 
{ 
    #region Membros 
    private SqlConnection cs = new SqlConnection("Data Source=.;Initial Catalog=canil;Integrated Security=True"); 
    private SqlDataAdapter da = new SqlDataAdapter(); 
    private SqlCommand cmd = new SqlCommand(); 
    private DataTable dt = new DataTable(); 
    #endregion 

    #region MembrosGetSetPrivados 
    private bool setCommand(string stringSQL) 
    { 
     try 
     { 
      cs.Open(); // Abre a Ligação 
      // 1. Instancia o novo comando com a query e a connecção 
      cmd = new SqlCommand(stringSQL, cs); 
      // 2. Executa o comando 
      try 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
     finally 
     { 
      //Fecha a ligação 
      if (cs != null) 
       cs.Close(); 
     } 
     return true; 
    } 
    private DataTable getCommand(string stringSQL) 
    { 
     da.SelectCommand = new SqlCommand(stringSQL, cs); 
     da.Fill(dt); 
     return dt; 
    } 
    #endregion 

    #region MembrosGetSetPublicos 

    public void getDonos(List<Dono> lista) 
    { 
     DataTable resultados = getCommand("SELECT * FROM dono;"); 
     foreach(DataRow dr in resultados.Rows) 
     { 
      int idDono, contacto; 
      string nome,morada; 
      idDono = Convert.ToInt32(dr[0]); 
      contacto = Convert.ToInt32(dr[1]); 
      nome = dr[2].ToString(); 
      morada = dr[3].ToString(); 
      Dono dono = new Dono(idDono, contacto, nome, morada); 
      getCaesDono(dono); 
      lista.Add(dono); 
     } 
    } 

    public void getCaesDono(Dono dono) 
    { 
     DataTable r = getCommand("SELECT cao.idCao,cao.idRaca,cao.chip,cao.peso,cao.nome,raca.descricao FROM cao,dono,raca WHERE cao.idCao = dono.idCao AND cao.idRaca = raca.idRaca AND dono.idDono = 1"); 
     foreach(DataRow linha in r.Rows) 
     { 
      int idCao = Convert.ToInt32(linha[0]); 
      int idRaca = Convert.ToInt32(linha[1]); 
      int chip = Convert.ToInt32(linha[2]); 
      double peso = Convert.ToDouble(linha[3]); 
      Raca raca = new Raca(idRaca,linha[5].ToString()); 
      string nome = linha[4].ToString(); 
      dono.caes.Add(new Cao(idCao, idRaca, chip, peso, raca, nome)); 
     } 
    } 

嗯,這可以解決我的問題,但我對此不以爲然。

Dono dono = new Dono(idDono, contacto, nome, morada); 
dal d = new dal(); 
d.getCaesDono(dono); 

所以很明顯,問題是SqlDataAdapter接縫,以保持最後的結果。我似乎無法找到任何方法來清除它或什麼。我應該使用另一個SqlDataAdapter嗎?我也認爲這不是答案。任何人都可以指路嗎?

+1

嘗試檢查是否已啓用緩存某處 –

+0

呵呵,是啊,但還是不幫我以任何方式,形狀或形式,所以...是啊。 – Vcoder

+0

我搜索了C#+ SQL +緩存+禁用,但沒有線索。你能指點我嗎? – Vcoder

回答

1

您使用全球DataTable這是隻初始化一次。但是,您似乎無法在通話之間清除它,因此舊數據仍在其中。您需要清除表格或讓數據適配器爲您完成(在填充前清除)。

And:do 不是getCommand中使用實例變量!像這樣做:

private DataTable getCommand(string stringSQL) 
{ 
    DataTable dt = new DataTable(); 

    using (SqlCommand cmd = new SqlCommand(stringSQL, cs)) 
    using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
    { 
     da.Fill(dt); 
    } 
    return dt; 
}