I'm new to C# and working with some code I inherited and noticed a performance issue. This code is looping multiple times on each column (the application selects a file and this code gets the selected columns for that file and adds to rows to datagridview). I suspect it's because it's reading the SQLDATAREADER in a WHILE LOOP and while in that loop executes a FOREACH LOOP.
My question is: how can I reduce this to one loop and add rows directly from the SQLDATAREADER as it's read?
My Code:
private void getAttributeSIDs() { String Sta3n = cbRegionSites.SelectedItem.ToString().Substring(1, 3); String fileNum = tvFileMan.SelectedNode.Tag.ToString(); SqlConnection cdw = new SqlConnection(ConfigurationManager.ConnectionStrings["CDW"].ConnectionString); cdw.Open(); SqlCommand cmd = new SqlCommand("SELECT VistaFieldNumber,VistaFieldSID,FieldType,FieldLength,WholeNumberDigits,DecimalDigits,PointsToFileNumber FROM CDWWork.Dim.VistaField WHERE VistaFileNumber='" + fileNum + "' AND Sta3n=" + Sta3n, cdw); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { String fieldNumber = rdr[0].ToString(); foreach (DataGridViewRow dr in dgvColumns.Rows) { if (dr.IsNewRow) break; if (dr.Cells["FMFieldNumber"].Value.ToString() == fieldNumber) { //Begin 1 dr.Cells["SourceAttributeSID"].Value = rdr[1].ToString(); dr.Cells["FMFieldType"].Value = rdr["FieldType"].ToString(); switch (rdr["FieldType"].ToString()) { case "FreeText": //Code dr.Cells["DWFieldDataType"].Value = "varchar"; dr.Cells["DWFieldLength"].Value = rdr["FieldLength"].ToString(); dr.Cells["FMFieldLength"].Value = rdr["FieldLength"].ToString(); break; case "Numeric": int whole; int tdecimal; whole = Convert.ToInt32(rdr["WholeNumberDigits"]); tdecimal = Convert.ToInt32(rdr["DecimalDigits"]); dr.Cells["DWFieldDataType"].Value="int"; //if (rdr["DecimalDigits"].ToString().Length > 0 ) if (tdecimal > 0) { dr.Cells["DWFieldDataType"].Value = "numeric"; } else { dr.Cells["DWFieldDataType"].Value = "int"; } dr.Cells["DWFieldLength"].Value = rdr["WholeNumberDigits"]; dr.Cells["DWFieldScale"].Value = rdr["DecimalDigits"]; break; case "Pointer": dr.Cells["DWFieldDataType"].Value = "varchar"; dr.Cells["DWFieldLength"].Value = "50"; dr.DefaultCellStyle.BackColor = Color.Aqua; dr.Cells["PointsToFileNumber"].Value = rdr["PointsToFileNumber"]; //change Suggested Column name for pointers dr.Cells["ColumnName"].Value = dr.Cells["ColumnName"].Value + "F" + (rdr["PointsToFileNumber"].ToString().Replace(".", "x")) + "IEN"; //dr.DefaultCellStyle.BackColor = Color.Aqua; break; case "SetOfCodes": dr.Cells["DWFieldDataType"].Value = "varchar"; dr.Cells["DWFieldLength"].Value = "500"; break; case "Date": dr.Cells["DWFieldDataType"].Value = "Date"; break; case "DateTime": dr.Cells["DWFieldDataType"].Value = "DateTime"; break; case "Computed": cbComputed.Checked = true; dr.DefaultCellStyle.BackColor = Color.Red; break; default: //Code dr.Cells["DWFieldDataType"].Value = "varchar"; break; } //End Switch } //End if } //End ForEach } //End While rdr.Close(); rdr.Dispose(); cmd.Dispose(); cdw.Close(); cdw.Dispose(); }