2013-04-08 55 views
1

我搜索堆栈溢出这种问题。但是我发现了几个关于这个问题的类似问题,但显示了不同的解决方案清除重复在Datagridview

我想在datagridview中显示数据而不重复。我不知道它是如何重复的。

conn.Open(); 
      query = "SELECT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName,Books.ISBN from Books,Authors"; 
      cmd = new SqlCommand(query, conn); 
      dr = cmd.ExecuteReader(); 

      while (dr.Read())    
      { 
       dataGridView1.Rows.Clear(); 
       dataGridView1.Rows.Add(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), dr[4].ToString()); 
      } 
      cmd.Dispose(); 
      conn.Close(); 

我希望发生什么:

的BookID | BookTitle |

100001 |社会学|等等。
100002 |历史|等等。

这是显示每次

的BookID数据网格| BookTitle |

100001 |社会学|等等。
100002 |历史|等等。
100001 |社会学|等等。
100002 |历史|等等。

回答

2

更改您的查询来从数据库DISTINCT记录,然后将它们绑定到datagridview

query = "SELECT DISTINCT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName, 
      Books.ISBN from Books,Authors"; 

注: 该查询将行不同,如果有任何列有不同的价值。所以这取决于你希望显示哪一列的值,并希望在网格上显示。

一件事,如果可能的话用JOIN而不是笛卡尔乘积这样

query = "SELECT DISTINCT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName, 
     Books.ISBN from Books 
     LEFT OUTER JOIN Authors on Books.AuthorId=Author.AuthorId"; 

编辑:尝试此结合

using(SqlReader reader = cmd.ExecuteReader()) 
    { 
     if (reader.HasRows) 
     { 
      DataTable dt = new DataTable(); 
      dt.Load(reader); 
      dataGridView1.DataSource = dt; 
     } 
    } 
+0

它仍然显示重复。其实,我的数据库没有重复的值。我不知道什么时候从数据库获取它们到DataGridView,它会变得重复。 – eaponz 2013-04-08 15:03:44

+0

@AkoSiAsiong将'SqlReader'改为'SqlDataReader' – DeMama 2013-04-08 15:32:21

2

试试这个

conn.Open(); 
query = "SELECT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName,Books.ISBN from Books,Authors"; 
cmd = new SqlCommand(query, conn); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 

dataGridView1.Clear(); 

da.Fill(dataGridView1); 

cmd.Dispose(); 
conn.Close(); 

如果没有把握这是完全正确的,但它可能有帮助。

1

你需要改变你的查询中使用DISTINCT,因为这将消除重复:

SELECT DISTINCT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName,Books.ISBN from Books,Authors