Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/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
C# 无法删除C中datatable中的空列名#_C#_Datatable_Ado.net_Oledbcommand - Fatal编程技术网

C# 无法删除C中datatable中的空列名#

C# 无法删除C中datatable中的空列名#,c#,datatable,ado.net,oledbcommand,C#,Datatable,Ado.net,Oledbcommand,我有一个Excel,业务用户将更新并发送给我们。Blue Prism robot将使用code stage拾取文件并上传到SQL数据库表中(使用code stage要快得多)。我已经编写了C#代码来实现这一点,但是大多数情况下由于列中的空白而失败 当代码使用usedrange时,它也会占用空白,并创建列名为F16、F17的数据表。。。(当列计数为15时) 我想动态地处理这个问题。i、 e无论列计数和空白列计数如何,代码都应该通过从数据表中删除这些空白列来工作 我已经写了一些代码来处理这个问题,但

我有一个Excel,业务用户将更新并发送给我们。Blue Prism robot将使用code stage拾取文件并上传到SQL数据库表中(使用code stage要快得多)。我已经编写了C#代码来实现这一点,但是大多数情况下由于列中的空白而失败

当代码使用usedrange时,它也会占用空白,并创建列名为F16、F17的数据表。。。(当列计数为15时)

我想动态地处理这个问题。i、 e无论列计数和空白列计数如何,代码都应该通过从数据表中删除这些空白列来工作

我已经写了一些代码来处理这个问题,但是没有成功。它抛出一个错误:

收集被修改;枚举操作可能无法执行[重复]

在上述代码中,似乎无法使用remove命令删除数据表中的任何列

如果有人能在这件事上帮助我,那将是很大的帮助

注意:我试着使用fornext循环像下面一样向后重复它,但仍然面临一个问题

                for (int z = dtTable.Columns.Count - 1; z>=0;z--)
                    {
                            if (dtTable.Columns[z].ColumnName.ToString()=="F" + (z).ToString())
                            dtTable.Columns.Remove(dtTable.Columns[z].ColumnName.ToString());
                        }
                        dtTable.AcceptChanges();

根据以下JohnPete22给出的评论,其工作性能良好


如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般的经验法则:如果你同时循环浏览一个集合,那么将其删除不是一个好主意,除非你是逆向操作

还应注意以下几点

我以前尝试过使用John的解决方案,但没有成功。然后我意识到我已经使用了if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString()),但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1)


根据以下JohnPete22给出的评论,其工作性能良好


如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般的经验法则:如果你同时循环浏览一个集合,那么将其删除不是一个好主意,除非你是逆向操作

还应注意以下几点

我以前尝试过使用John的解决方案,但没有成功。然后我意识到我已经使用了if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString()),但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1)


如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般经验法则:如果您同时循环使用一个集合,则从该集合中删除该集合不是一个好主意,除非您反向操作。如果您正在查找列,则没有理由循环使用数据行。您也不必遍历DataColumns,因为您只需要查看列是否存在,如果存在,则删除该列。不需要循环。@我可以修剪空行和空列。行可以正常工作,但列不能正常工作。@JohnPete22感谢您的宝贵输入。我之前试过用这个,但没用。现在我明白了为什么我使用if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString())但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1).ToString()),因为额外的空白名称使用了列的索引1而不是0。请将您的评论作为答案发布,我可以将此标记为resolvedGlad,您已经解决了它。另一个挑剔之处:我建议使用string.compare而不是==<代码>整数z=1;如果(string.Compare(“ColumnName”、string.Format(“F{0}”、z+1)、StringComparison.InvariantCulture)==0){//code to execute}仔细想想,您将循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般经验法则:如果您同时循环使用一个集合,则从该集合中删除该集合不是一个好主意,除非您反向操作。如果您正在查找列,则没有理由循环使用数据行。您也不必遍历DataColumns,因为您只需要查看列是否存在,如果存在,则删除该列。不需要循环。@我可以修剪空行和空列。行可以正常工作,但列不能正常工作。@JohnPete22感谢您的宝贵输入。我之前试过用这个,但没用。现在我明白了为什么我使用if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString())但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1).ToString()),因为额外的空白名称使用了列的索引1而不是0。请将您的评论作为答案发布,我可以将此标记为resolvedGlad,您已经解决了它。另一个挑剔之处:我建议使用string.compare而不是==<代码>整数z=1;if(string.Compare(“ColumnName”、string.Format(“F{0}”、z+1)、StringComparison.InvariantCulture)==0){//code to execute}
                for (int z = dtTable.Columns.Count - 1; z>=0;z--)
                    {
                            if (dtTable.Columns[z].ColumnName.ToString()=="F" + (z).ToString())
                            dtTable.Columns.Remove(dtTable.Columns[z].ColumnName.ToString());
                        }
                        dtTable.AcceptChanges();