我正在制作一个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吗?我也认为这不是答案。有谁能指出我的方式?
答案 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;
}