DataTable返回旧结果

时间:2014-02-28 10:07:20

标签: c# sql tsql visual-studio-2013

我正在制作一个c#aplication,我非常确定我的代码是正确的,但我对c#的SQL连接不熟悉。我的问题是我有2个对象,其中A包含B并且我执行查询以获取所有A行将它们添加到列表中并且对于每个A行我去搜索它的B并将它们添加到A.bList。在B查询上,结果是A>。>到底是怎么回事?

如果有帮助的话。这两个类是所有者和狗 所以类所有者(Dono)有一个狗(Cao)对象列表。

    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 :(得分:1)

您使用仅初始化一次的全局DataTable。但是,您似乎没有在调用之间清除它,因此旧数据仍保留在其中。您需要清除表格或让数据适配器为您完成(填写前清除)。

并且: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;
}