2014-02-28 58 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; 
}