Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET循环统计每本书的作者数_Vb.net_Loops_Foreach - Fatal编程技术网

VB.NET循环统计每本书的作者数

VB.NET循环统计每本书的作者数,vb.net,loops,foreach,Vb.net,Loops,Foreach,我想数一数表中每本书的作者人数。 我得到的结果不正确 表标题\u AuthorTest: 国际标准书号Au_ID2 第1册-作者1, 第二册-作者2, 第2册-作者3 结果-运行代码后: 2本书,1位作者, 0本书,2位作者, 有3位作者的0本书, 结果应该是: 1本书,1位作者, 1本书,2位作者, 有3位作者的0本书, 我将开始更改SQL命令并使用GROUPBY Dim cmdText = "SELECT ISBN, COUNT(ISBN) as NrAuthors from

我想数一数表中每本书的作者人数。 我得到的结果不正确

表标题\u AuthorTest: 国际标准书号Au_ID2 第1册-作者1, 第二册-作者2, 第2册-作者3

结果-运行代码后: 2本书,1位作者, 0本书,2位作者, 有3位作者的0本书,

结果应该是: 1本书,1位作者, 1本书,2位作者, 有3位作者的0本书,


我将开始更改SQL命令并使用GROUPBY

Dim cmdText = "SELECT ISBN, COUNT(ISBN) as NrAuthors from Title_AuthorTest 
               GROUP BY ISBN
               ORDER BY COUNT(ISBN) DESC"

ISBNCommand = New OleDbCommand(cmdText, BooksConnection)
现在,您已将所有图书按其ISBN进行分组,每条记录都包含ISBN和该ISBN的作者数量。
在这一点上,您的代码可以大大简化

For Each MyRow as DataRow In ISBNTable.Rows 
    Dim numAuthors As Integer = Convert.ToInt32(MyRow("NrAuthors"))
    AuthorCount(numAuthors) += 1
Next

当然,这将允许一本书最多由10位作者撰写。如果有一本书的作者超过10位,我们需要在为AuthorCount数组编制索引之前进行检查,或者更改我们使用不同结构存储此信息的方式

因此,如果一本书有两位作者,那么表中有两行吗?这不是表示关系book->author的正确方法。您应该有一个作者表和一个表示图书和作者之间关系的表。此表包含ISBN和authors表的外键。我一直以这种方式编码:
将每个MyRow作为ISBNTable.Rows中的DataRow,并用
Dim
删除该行。在你看来,我可能是错的,但我的行似乎只是第一次成为一个新的行。依我看,这总是新的一排。我不确定这是否会改变什么,但这是我首先想到的。关于
for
语句如何处理变量,我可能是错的。您使用variable
Author
时似乎有问题。我建议创建新的var的
CurrentISBN
AuthorsPerISBN
,它们更清楚它们的目的并重新编码。@technonaut我发现作者可能有问题。你能帮我修一下吗?我无法控制它。谢谢,它能工作!我仍然不明白我的foreach语句哪里出错了。要发现实际代码的错误,最好的方法是使用调试器。在进入行循环之前放置一个断点,您将看到Author变量在数组中索引错误的位置。如果您喜欢此解决方案,请务必单击“接受答案”复选标记,这样他们就可以获得帮助解决问题的功劳。我将尝试。谢谢
For Each MyRow as DataRow In ISBNTable.Rows 
    Dim numAuthors As Integer = Convert.ToInt32(MyRow("NrAuthors"))
    AuthorCount(numAuthors) += 1
Next