1

我在 Stack Overflow 上搜索了此类问题。但是我发现了几个类似的问题,但显示了不同的解决方案。

我想在我的 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();

我想要发生的事情:

书号 | 书名 | ETC..

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

这是每次都显示的数据网格

书号 | 书名 | ETC..

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

4

3 回答 3

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;
        }
     }
于 2013-04-08T15:00:08.240 回答
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();

不确定这是否完全正确,但它可能会有所帮助。

于 2013-04-08T15:05:39.927 回答
1

您需要更改查询以使用 DISTINCT,因为这将删除重复项:

SELECT DISTINCT Books.BookID,Books.Title,Books.AuthorID,Authors.AuthorName,Books.ISBN from Books,Authors
于 2013-04-08T15:38:17.480 回答