【问题标题】:Using SQL cursor for displaying data from database使用 SQL 游标显示数据库中的数据
【发布时间】:2016-04-19 12:51:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我建议不要使用游标,因为在数据库中查询时它们可能会导致性能下降问题。我会推荐使用 LINQ to SQL 或 StoredProcedure 从 DB 中获取结果。实际的解决方案将取决于您的类结构。
  • 您可以从这里获得帮助:codeproject.com/Articles/63715/BookStore

标签: c# sql datagridview cursors


【解决方案1】:
FOR XML

是把一列正常放入逗号分隔列表的方式:

How to get column values in one comma separated value

显然不必用逗号分隔它们,您可以输入 CHAR(13) 或任何您需要的东西。

【讨论】:

    【解决方案2】:

    这是一个完成的代码示例,您可以如何做到这一点(也包括其他人已经建议的内容)。这就是你要找的东西吗?

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

    【讨论】:

    • 我想就是这个了:)我稍后再看。
    • 是的,这与我建议的方法相同。仅供参考 - STUFF 关键字不是此技术的重要部分,它只是删除前导逗号和空格的一种干净方法。 (尽管在上面的代码 sn-p 中它需要更改为 STUFF(... ,1,2,'')
    • George Dando 感谢您澄清 STUFF 不是重要部分。我在示例中添加了 STUFF(... ,1,2,'') 以删除前导“,”。
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2021-09-19
    • 1970-01-01
    • 2015-12-31
    • 2013-12-21
    相关资源
    最近更新 更多