2016-06-08 63 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中實際上有記錄。在第二次運行時,它顯示了正確的行數......但它似乎並未實際加載值? –

相關問題