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();
}