数据表参数超出范围异常

DataTable ArgumentOutOfRangeException

下面的代码在 运行 第一次针对我的 DataTable 时完全正常工作。加载数据 table,它使用指定的字符串更新所有指定的列数据。一切都已正确关闭(并且可能已清除)。

public void AppendKeyColumn(string appendText, params string[] columnNames)
{               
    string columns = "";

    // Create a list of the columns to use, comma separated.
    for (int column = 0; column < columnNames.Length; column++)
    {
        if ((column + 1) == columnNames.Length)
        {
            columns += columnNames.ElementAt(column);
        }
        else
        {
            columns += columnNames.ElementAt(column) + ", ";
        }
    }

    // SQL Statement for querying the file. Change after FROM for proper table name.
    string sql = "SELECT " + columns + " FROM " + TableName;

    // Using to create a command variable (so it will be properly disposed after block execution).
    using (OleDbCommand cmd = new OleDbCommand(sql, Connection))
    {
        // Open a connection to the data source.
        Connection.Open();

        // Open the datareader, load the datatable with the data in the reader, and then close the reader.
        Data = cmd.ExecuteReader();
        Table.Load(Data);
        Data.Close();

        foreach (string column in columnNames)
        {
            // Run UPDATE statement to append text to end of column name.
            for (int row = 0; row < Table.Rows.Count; row++)
            {
                string sql2 = "UPDATE " + TableName + " SET " + column + " = @newName WHERE " + 
                        column + " = @oldName";

                using (OleDbCommand cmd2 = new OleDbCommand(sql2, Connection))
                {
                    string oldString = Table.Rows[row][0].ToString();                          
                    string newString = oldString.Remove(oldString.Length - 1);
                    newString = newString.Insert(newString.Length, appendText);

                    cmd2.Parameters.AddWithValue("@newName", newString);
                    cmd2.Parameters.AddWithValue("@oldName", oldString);

                    if (!Equals(oldString.Substring(oldString.Length-1, 1), appendText))
                    {
                        cmd2.ExecuteNonQuery();
                    }
                }  
            }
        }

        Table.Clear();
        Connection.Close();
    }
}

我的问题在于我第二次 运行 这段代码。如果我在同一个 table 上再次调用它,我会收到以下错误(来自这一行 string newString = oldString.Remove(oldString.Length - 1);)。 DataTable 在调用它的列中不应有任何空字符串。在第一次调用时,DataTable 加载并且按预期工作。在第二个 运行 上,它似乎确认了 DataTable 中正确的行数,但实际上它似乎是空的。

InnerException:
System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
Parameter name: startIndex
    at System.String.Remove(Int32 startIndex)

我假设我可能忽略了一些基本的东西,但有人可以指出我正确的方向吗?

您 运行 变成了空字符串。无需太深入,解决此问题的方法是:

var newString = "";
if(oldString != String.Empty)
{
    newString  = oldString.Remove(oldString.Length - 1);
}

你的问题是由 Table 对象引起的,我认为它是一个数据 Table,所以如果你在行 Table.Load(Data); 之前添加 Table = new DataTable;

这是一种很好的清理方法
string sql = String.Format("SELECT ({0}) FROM {1};", String.Join(", ", columnNames), TableName);