簡體   English   中英

無法刪除 C# 中數據表中的空列名

[英]Unable to remove empty column names in the datatable in C#

我有一個 Excel,企業用戶將更新它並發送給我們。 Blue Prism 機器人會選擇文件並使用 code stage 上傳到 SQL 數據庫表中(使用 code stage 會快得多)。 我已經編寫了 C# 代碼來執行此操作,但是大多數情況下由於列中的空白而失敗。

當代碼使用已用范圍時,它也會占用空格並創建列名為 F16、F17 的數據表...(當列數為 15 時)

我想動態處理這個。 即,無論列數和空白列數如何,代碼都應該通過從數據表中刪除那些空白列來工作

我已經編寫了代碼來處理這個問題,但它沒有用。 它拋出一個錯誤:

收藏已修改; 枚舉操作可能無法執行

try
{
    string excelConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", Path);
    using (OleDbConnection xlConnection = new OleDbConnection(excelConnectionString)) 
    { 
        OleDbCommand oleDbCmd = new OleDbCommand ("Select * FROM [" + SheetName + "$]", xlConnection); 

        xlConnection.Open(); 

        // Create DbDataReader to Data Worksheet 
        using (DbDataReader dbDtRdr = oleDbCmd.ExecuteReader()) 
        { 
                //Remove Empty Rows
                var dtTable = new DataTable();
                dtTable.Load(dbDtRdr);

                for (int i = dtTable.Rows.Count - 1; i>=0;i--)
                {
                    if(dtTable.Rows[i][1] == DBNull.Value)
                        dtTable.Rows[i].Delete();
                }

                dtTable.AcceptChanges();

                //Remove Empty Columns
                int z = 1;

                foreach(DataRow r in dtTable.Rows)
                {
                    foreach(DataColumn c in dtTable.Columns)
                    {   
                        if (c.ColumnName=="F" + z.ToString())
                            dtTable.Columns.Remove(c.ColumnName);
                    }
                }

                dtTable.AcceptChanges();

                // SQL Server Connection String 
                string sqlConnectionString = @"Data Source=" + SQLServerName + ";Initial Catalog=" + SQLDBName + ";Integrated Security=True"; 

                // Bulk Copy to SQL Server 
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
                { 
                    bulkCopy.DestinationTableName = TableName; 
                    bulkCopy.WriteToServer(dtTable); 
                }
        } 

        xlConnection.Close();
    }

    Success = true;
    Message = "Success";
}
catch (System.IO.IOException e)
{
    Message = e.Message;
    Success = false;        
}

看起來我無法使用上述代碼中的刪除命令刪除數據表中的任何列

如果有人在這方面幫助我,那將是很大的幫助。

注意:我嘗試使用 For Next 循環來向后重復它,如下所示,但仍然遇到問題

                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 的評論,它的工作正常

如果您考慮一下,您會遍歷每個 DataColumn,然后同時從該 Collection 中刪除,這是不可能的。 您需要一個 For 循環,然后向后循環到 0(您可以看到該行正上方發生)。 一般經驗法則:從同時循環的集合中刪除不是一個好主意,除非你向后工作

還應注意以下幾點

我之前嘗試過使用 John 的解決方案,但沒有奏效。 然后我意識到我已經使用了 if (dtTable.Columns[z].ColumnName.ToString()=="F" + (z).ToString()) 但是它應該是 if (dtTable.Columns[z].ColumnName. ToString()=="F" + (z+1).ToString()) 因為附加的空白名稱使用索引 1 而不是 0 用於列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM