今天在工作中遇到一個詭異的問題,代碼如下:
private DataTable CovertDataType(DataTable orgDataTable, string colNames, string convertCol, YstPack.Common.ColumnType convertDataType) { DataTable dt = new DataTable(); //複製表結構 dt = orgDataTable.Clone(); foreach (DataColumn column in dt.Columns) { if (column.ColumnName == convertCol) { //修改列類型 column.DataType = typeof(Guid); } } string[] colArry = colNames.Split(','); foreach (DataRow dr in orgDataTable.Rows) { DataRow newdr = dt.NewRow(); foreach (string str in colArry) { if (str == convertCol)//轉換列資料類型 { switch (convertDataType) { case YstPack.Common.ColumnType.唯一標識: newdr[str] = new Guid(dr[str].ToString()); break; default: break; } } else { newdr[str] = dr[str];//不需要轉化,直接賦值,但是這裡就拋出異常! } } dt.Rows.Add(newdr); } return dt; }
運行 foreach (string str in colArry)迴圈第一次能成功,但是第二次就報列“X”不屬於表異常 !不知道這是不是一個bug!
後面把代碼改成如下又正確了:
private DataTable CovertDataType(DataTable orgDataTable, string colNames, string convertCol, YstPack.Common.ColumnType convertDataType) { DataTable dt = new DataTable(); try { //複製表結構 dt = orgDataTable.Clone(); foreach (DataColumn column in dt.Columns) { if (column.ColumnName == convertCol) { //修改列類型 column.DataType = typeof(Guid); } } string[] colArry = colNames.Split(','); foreach (DataRow dr in orgDataTable.Rows) { DataRow newdr = dt.NewRow(); for (int i = 0; i < colArry.Length; i++) { if (colArry[i].ToString() == convertCol)//轉換列資料類型 { newdr[i] = new Guid(dr[i].ToString()); } else { newdr[i] = dr[i]; } } dt.Rows.Add(newdr); } } catch (Exception e) { MessageBox.Show(e.Message); } return dt; }