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

时间:2016-04-19 12:51:34

标签: c# sql datagridview cursors

我正在制作C#Windows Form Application,它连接到数据库 主题是:书店

在其中一个应用程序表单中,有DataGridView,它显示有关商店中每本书的信息 在数据库中,一本书是独一无二的,其ISBN和不同的书籍在这种情况下可以具有相同的名称 此外,书籍可以有很多作者 这意味着,当我查询显示所有书籍时,它会多次列出同一本书,以显示该书中的所有作者 当然,我想要的是将一列中的所有作者列在一行中,一本书。

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

另外,是否有更好的方法可以做到这一点,然后使用游标?

3 个答案:

答案 0 :(得分:2)

FOR XML

是否正常将列放入逗号分隔列表:

How to get column values in one comma separated value

显然,它不必是逗号分隔它们,你可以把CHAR(13)或任何你需要的东西。

答案 1 :(得分:1)

这是一个完成的代码示例,您可以如何执行此操作(也可以使用其他人已经建议的内容)。这是你想要的吗?

-- 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

答案 2 :(得分:0)

如果您正在使用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