数据表参数超出范围异常
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);
下面的代码在 运行 第一次针对我的 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);