2013-04-20 76 views
0

這是@Tim Schmelter指示我朝着今天下午的正確方向的一些實驗性代碼。它的大部分幾乎完全相同,因爲無論我嘗試哪種方式,它都會在最後一行或第二行輸入invalidCastException。我看不出這是爲什麼。獲取InvalidCastException未處理

Boolean test = false; 
string filePathStudent = System.IO.Path.GetFullPath("StudentInfo.txt"); 
DataTable studentDataTable = new DataTable(); 

studentDataTable.Columns.Add("Id", typeof(int)); 
studentDataTable.Columns.Add("StudentID"); 
studentDataTable.Columns.Add("FirstName"); 
studentDataTable.Columns.Add("LastName"); 
studentDataTable.Columns.Add("StreetAdd"); 
studentDataTable.Columns.Add("City"); 
studentDataTable.Columns.Add("State"); 
studentDataTable.Columns.Add("Zip"); 
studentDataTable.Columns.Add("Choice1"); 
studentDataTable.Columns.Add("CreditHrs1"); 
studentDataTable.Columns.Add("Choice2"); 
studentDataTable.Columns.Add("CreditHrs2"); 
studentDataTable.Columns.Add("Choice3"); 
studentDataTable.Columns.Add("CreditHrs3"); 
studentDataTable.Columns.Add("Choice4"); 
studentDataTable.Columns.Add("CreditHrs4"); 
studentDataTable.Columns.Add("Choice5"); 
studentDataTable.Columns.Add("CreditHrs5"); 
studentDataTable.Columns.Add("Choice6"); 
studentDataTable.Columns.Add("CreditHrs6"); 

foreach (string line in File.ReadLines(filePathStudent)) 
{ 
    DataRow row = studentDataTable.Rows.Add(); 
    string[] fields = line.Split(new[] { (char)9 }); 
    int id; 
    if (fields.Length == 19 && int.TryParse(fields[0], out id)) 
    { 
     row.SetField("Id", id); 
     row.SetField("StudentID", fields[1]); 
     row.SetField("FirstName", fields[2]); 
     row.SetField("LastName", fields[3]); 
     row.SetField("StreetAdd", fields[4]); 
     row.SetField("City", fields[5]); 
     row.SetField("State", fields[6]); 
     row.SetField("Zip", fields[7]); 
     row.SetField("Choice1", fields[8]); 
     row.SetField("CreditHrs1", fields[9]); 
     row.SetField("Choice2", fields[10]); 
     row.SetField("CreditHrs2", fields[11]); 
     row.SetField("Choice3", fields[12]); 
     row.SetField("CreditHrs3", fields[13]); 
     row.SetField("Choice4", fields[14]); 
     row.SetField("CreditHrs4", fields[15]); 
     row.SetField("Choice5", fields[16]); 
     row.SetField("CreditHrs5", fields[17]); 
     row.SetField("Choice6", fields[18]); 
     row.SetField("CreditHrs6", fields[19]); 
    } 
} 

using (StreamReader reader = new StreamReader(filePathStudent)) 
{ 
    String line1 = reader.ReadLine(); 
    if (line1 == null) 
     maxIDStdTable = 0; 
    else 
     test = true; 

    reader.Dispose(); 
    reader.Close(); 
} 

if(test) 
    int maxIDStdTable = studentDataTable.AsEnumerable().Max(r => r.Field<int>("Id")); 
    //int maxIDStdTable = (int)studentDataTable.Compute("Max(Id)", ""); 
+0

你在哪裏得到異常,獲得最大值? – Arshad 2013-04-20 03:55:49

+0

這是正確的。 – user2297683 2013-04-20 04:06:00

+0

查看我的答案 – Arshad 2013-04-20 04:13:32

回答

0

它可能不是最好的解決辦法,但它的工作原理。

  string filePathStudent = System.IO.Path.GetFullPath("StudentInfo.txt"); 
     DataTable studentDataTable = new DataTable(); 

     studentDataTable.Columns.Add("Id", typeof(Int32)); 
     studentDataTable.Columns.Add("StudentID"); 
     studentDataTable.Columns.Add("FirstName"); 
     studentDataTable.Columns.Add("LastName"); 
     studentDataTable.Columns.Add("StreetAdd"); 
     studentDataTable.Columns.Add("City"); 
     studentDataTable.Columns.Add("State"); 
     studentDataTable.Columns.Add("Zip"); 
     studentDataTable.Columns.Add("Choice1"); 
     studentDataTable.Columns.Add("CreditHrs1"); 
     studentDataTable.Columns.Add("Choice2"); 
     studentDataTable.Columns.Add("CreditHrs2"); 
     studentDataTable.Columns.Add("Choice3"); 
     studentDataTable.Columns.Add("CreditHrs3"); 
     studentDataTable.Columns.Add("Choice4"); 
     studentDataTable.Columns.Add("CreditHrs4"); 
     studentDataTable.Columns.Add("Choice5"); 
     studentDataTable.Columns.Add("CreditHrs5"); 
     studentDataTable.Columns.Add("Choice6"); 
     studentDataTable.Columns.Add("CreditHrs6"); 

     // Read in a file line-by-line, and store it 
     var txtFileLine = File.ReadAllLines(filePathStudent).ToList(); 

     //Reads line splits data to colums at tab (ASCII value 9) 
     txtFileLine.ForEach(line => studentDataTable.Rows.Add(line.Split((char)9))); 


     List<int> rowsForColumn1 = studentDataTable.AsEnumerable().Select(x => x.Field<int>(0)).ToList(); 

     //Tests for empty Datatable 
     foreach (DataRow row in studentDataTable.Rows) 
     { 
      if (row.IsNull("Id")) 
       break; 
      else 
       //get max value from "Id" row. 
       maxIDStdTable = rowsForColumn1.Max(); 
     } 
    } 
0

你已經犯了兩個錯誤:
1)你必須創建新的DataRowDataTable.NewRow()
2)Sfter設置DataRow你必須將其與DataTable.Rows.Add(youDataRow)添加到DataTable
更新您的代碼,並嘗試:

foreach (string line in File.ReadLines(filePathStudent)) 
    { 
     DataRow row = studentDataTable.NewRow(); 
     string[] fields = line.Split(new[] { (char)9 }); 
     int id; 
     if (fields.Length == 19 && int.TryParse(fields[0], out id)) 
     { 
      row["Id"]= id; 
      row["StudentID"]= fields[1]; 
      row["FirstName"]= fields[2]; 
      row[LastName"]= fields[3]; 
      row["StreetAdd"]= fields[4]; 
      row["City"]=fields[5]; 
      row["State"]= fields[6]; 
      row["Zip"]=fields[7]; 
      row["Choice1"]= fields[8]; 
      row["CreditHrs1"]= fields[9]; 
      row["Choice2"]= fields[10]; 
      row["CreditHrs2"]= fields[11]; 
      row[("Choice3"]= fields[12]; 
      row["CreditHrs3"]=, fields[13]; 
      row["Choice4"]= fields[14]; 
      row["CreditHrs4"]= fields[15]; 
      row["Choice5"]= fields[16]; 
      row["CreditHrs5"]= fields[17]; 
      row["Choice6"]= fields[18]; 
      row["CreditHrs6"] =fields[19]; 
     } 
     studentDataTable.Rows.Add(row); 

    } 
+0

新行'studentDataTable.Rows.Add(row);'拋出:System.ArgumentException未處理 消息=此行已屬於此表。 – user2297683 2013-04-20 04:21:07

+0

檢查更新的代碼 – Arshad 2013-04-20 04:31:05

+0

@Ashad我第一次錯過了NewRow()。無論如何,我糾正它後,我仍然得到「System.InvalidCastException未處理 消息=無法強制DBNull.Value鍵入'System.Int32'。請使用可空類型」at'int maxIDStdTable = studentDataTable.AsEnumerable()。 Max(r => r.Field (「Id」));' – user2297683 2013-04-20 04:36:04