2016-06-08 75 views
0

下面的代码与第一次运行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) 

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

+0

看起来像在表中的列值之一是空,因此它会oldstring.length为0,因此它抛出这个错误? – Akhilesh

回答

1

您的问题接缝由表对象,我想这是一个数据表,因此,如果您之前添加Table = new DataTable;引起线Table.Load(Data);

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

+0

这解决了它! 为什么我需要在重新使用它之前实例化新的DataTable?我假设我可以在我的对象中创建一次,然后再次清除()并加载()它... –

+1

DataTable是垃圾收集时的一个气质组件。 DataTable相信已经加载了,所以它不会第二次加载。 –

0

您正在使用空字符串。如果没有深入的得到太多,有一两件事你可以做些什么来解决这个问题是:

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

对不起。我将编辑我的帖子来澄清,但是我正在运行此功能的列中没有空字符串。而不应该有任何空的字符串。 第一次运行时,DataTable中实际上有记录。在第二次运行时,它显示了正确的行数......但它似乎并未实际加载值? –

相关问题