下面的代碼與第一次運行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