C# 使用SQL游标显示数据库中的数据

C# 使用SQL游标显示数据库中的数据,c#,sql,datagridview,cursors,C#,Sql,Datagridview,Cursors,我正在制作C#Windows窗体应用程序,它已连接到数据库。 主题是:书店 在应用程序的一个表单中,有一个DataGridView,它显示商店中每本书的信息。 在数据库中,一本书的ISBN是唯一的,在这种情况下,不同的书可以有相同的名称。 此外,书籍可以有许多作者。 也就是说,当我进行显示所有书籍的查询时,它会多次列出同一本书,以显示该书中的所有作者。 当然,我想要的是在一列、一行、一本书中列出所有作者 有人告诉我,这可以用游标来完成。 但是,我无法想象如何使用它们。 我不需要精确的代码,我只需

我正在制作C#Windows窗体应用程序,它已连接到数据库。
主题是:书店

在应用程序的一个表单中,有一个DataGridView,它显示商店中每本书的信息。
在数据库中,一本书的ISBN是唯一的,在这种情况下,不同的书可以有相同的名称。
此外,书籍可以有许多作者。
也就是说,当我进行显示所有书籍的查询时,它会多次列出同一本书,以显示该书中的所有作者。
当然,我想要的是在一列、一行、一本书中列出所有作者

有人告诉我,这可以用游标来完成。
但是,我无法想象如何使用它们。
我不需要精确的代码,我只需要一些指导来解决这个问题


此外,是否有更好的方法来实现这一点,然后使用游标?

如果您正在使用Oracle DB,您可以使用LISTAGG-函数,如下所示:

SELECT listagg(a.author_name, ',') WITHIN GROUP (ORDER BY b.isin) names 
  FROM books b
  join book_authors ba on ba.bookId = b.bookId
  join authors a on a.authorId = ba.authorid

如果您使用的是Oracle DB,您可以使用LISTAGG-函数,如下所示:

SELECT listagg(a.author_name, ',') WITHIN GROUP (ORDER BY b.isin) names 
  FROM books b
  join book_authors ba on ba.bookId = b.bookId
  join authors a on a.authorId = ba.authorid
将列放入逗号分隔列表的方法通常是:

显然,不必用逗号分隔它们,您可以放入CHAR(13)或任何您需要的内容

将列放入逗号分隔列表的方法通常是:


显然,它们之间不必用逗号分隔,您可以放入CHAR(13)或任何您需要的内容。

这里是一个完整的代码示例,说明了如何做到这一点(也包括其他人已经建议的内容)。这就是你要找的吗

-- declare variables

declare @ParamterCurrencyAmount numeric(26, 2),
        @ParameterRollingVisitSum int


-- declare table variable

declare @Books table
(
    ISBN int not null primary key,
    BookName varchar(255) not null
)

-- declare table variable

declare @Authors table
(
    AuthorID int primary key not null,
    AuthorName varchar(255) not null
)

-- declare table variable

declare @BookAuthorRelations table
(
    BookAuthorRelations int not null primary key,
    ISBN int not null,
    AuthorID int not null
)


-- insert sample data 

insert into @Books
(
    ISBN,
    BookName
)
select 1000, 'Book A' union all
select 2000, 'Book B' union all
select 3000, 'Book C'

insert into @Authors
(
    AuthorID,
    AuthorName
)
select 1, 'Jack' union all
select 2, 'Peter' union all
select 3, 'Donald'

insert into @BookAuthorRelations
(
    BookAuthorRelations,
    ISBN,
    AuthorID
)
select 1, 1000, 1 union all
select 2, 1000, 2 union all
select 3, 1000, 3 union all
select 4, 2000, 1 union all
select 5, 2000, 2 union all
select 6, 3000, 1


-- get books (with stuff)

select distinct Books.BookName,
stuff(
        (
            select distinct ', ' + Authors.AuthorName
            from @Authors Authors,
            @BookAuthorRelations BookAuthorRelations
            where BookAuthorRelations.AuthorID = Authors.AuthorID
            and Books.ISBN = BookAuthorRelations.ISBN
            for xml path(''), type
        ).value('.', 'NVARCHAR(MAX)') 
    , 1, 2,'') data
from @Books Books

下面是一个完整的代码示例,说明了如何做到这一点(还有其他人已经建议的内容)。这就是你要找的吗

-- declare variables

declare @ParamterCurrencyAmount numeric(26, 2),
        @ParameterRollingVisitSum int


-- declare table variable

declare @Books table
(
    ISBN int not null primary key,
    BookName varchar(255) not null
)

-- declare table variable

declare @Authors table
(
    AuthorID int primary key not null,
    AuthorName varchar(255) not null
)

-- declare table variable

declare @BookAuthorRelations table
(
    BookAuthorRelations int not null primary key,
    ISBN int not null,
    AuthorID int not null
)


-- insert sample data 

insert into @Books
(
    ISBN,
    BookName
)
select 1000, 'Book A' union all
select 2000, 'Book B' union all
select 3000, 'Book C'

insert into @Authors
(
    AuthorID,
    AuthorName
)
select 1, 'Jack' union all
select 2, 'Peter' union all
select 3, 'Donald'

insert into @BookAuthorRelations
(
    BookAuthorRelations,
    ISBN,
    AuthorID
)
select 1, 1000, 1 union all
select 2, 1000, 2 union all
select 3, 1000, 3 union all
select 4, 2000, 1 union all
select 5, 2000, 2 union all
select 6, 3000, 1


-- get books (with stuff)

select distinct Books.BookName,
stuff(
        (
            select distinct ', ' + Authors.AuthorName
            from @Authors Authors,
            @BookAuthorRelations BookAuthorRelations
            where BookAuthorRelations.AuthorID = Authors.AuthorID
            and Books.ISBN = BookAuthorRelations.ISBN
            for xml path(''), type
        ).value('.', 'NVARCHAR(MAX)') 
    , 1, 2,'') data
from @Books Books

我建议不要使用游标,因为在DB中查询时,它们可能会导致性能下降问题。我建议使用LINQtoSQL或StoredProcess从数据库获取结果。实际的解决方案将取决于您的类结构。您可以从这里获得帮助:我建议不要使用游标,因为当您在DB中查询时,它们可能会导致性能下降问题。我建议使用LINQtoSQL或StoredProcess从数据库获取结果。实际的解决方案将取决于您的类结构。您可以从这里获得帮助:您的确切需求是什么?是否要使用光标?正如我在前面的评论中所说的,请使用存储过程。好的,但在这里,您将找到一个与SQL Server等效的LISTAGG,您的确切要求是什么?是否要使用光标?正如我在前面的评论中所说的,使用存储过程。好的,但是在这里你会发现一个与SQL Server等价的LISTAGG,我想这就是:)我稍后会看它。是的,这是我建议的相同方法。仅供参考-STUFF关键字不是此技术的重要部分,这只是一种删除前导逗号和空格的干净方法。(虽然在上面的代码片段中,它需要更改为STUFF(…,1,2')。George Dando感谢您澄清STUFF不是重要的部分。我在示例中添加了STUFF(…,1,2'),以删除前导“,”。我想就是它了:)我稍后会看它。是的,这是我建议的相同方法。仅供参考-STUFF关键字不是此技术的重要部分,这只是一种删除前导逗号和空格的干净方法。(尽管在上面的代码片段中,它需要更改为STUFF(…,1,2')。George Dando感谢您澄清STUFF不是重要的部分。我在示例中添加了STUFF(…,1,2'),以删除前导的“,”。