下面的代码与第一次运行DataTable时的操作完全相同。数据表被加载,它使用指定的字符串更新指定的所有列数据。一切都已经关闭(并可能被清除)。DataTable ArgumentOutOfRangeException
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();
}
}
我的问题在于当我第二次运行此代码时。如果我在同一张桌子上再次调用它,会出现以下错误(从此行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)
我假设我可能忽略了一些基本的东西,但有人可以请我指出我的方向是正确的吗?
看起来像在表中的列值之一是空,因此它会oldstring.length为0,因此它抛出这个错误? – Akhilesh