Asked by:
nested loops and variable scope

Question
-
I used the following code behind to read data and display from two access files, "employee" and "records" using two nested loops. (Both data tables has a column "EPF") first to read the employee number from "employee" , then corresponding records from "records" file. when I run the program it gives only the records relevant to the first employee (i.e records relevant to first EPF number.) please help me to solve the problem.
using System.Collections;
using System.Configuration;using System.ComponentModel;
using System.Data.SqlClient;
using System.Drawing;
using System.Web.SessionState;
using System.Text;
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Data;
using System.Data.OleDb;
namespace viewevent
{
/// <summary>
/// Summary description for ViewImage.
/// </summary>
public class ViewImage : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//build our query statement for both databases
string ConnectionString_1 = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + MapPath("employee.mdb") ;
OleDbConnection connection_1 = new OleDbConnection(ConnectionString_1);
string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + MapPath("records.mdb") ;
OleDbConnection connection = new OleDbConnection(ConnectionString);
//open the database and get a datareader for both databases
connection_1.Open();
connection.Open();
string SQL_1;
string SQL;
SQL_1 = "SELECT * from file where Category='ph' order by EPF asc";
SQL = "SELECT * from file where Category='ph' order by EPF asc";
OleDbCommand cmd_1 = new OleDbCommand(SQL_1,connection_1);
OleDbDataReader rd_1 = cmd_1.ExecuteReader();
OleDbCommand cmd = new OleDbCommand(SQL,connection);
OleDbDataReader rd = cmd.ExecuteReader();
string EPF,epf;
int k=0; // record counter
while(rd_1.Read()) // read employee
{
if ( rd_1["FileSize"].ToString() != "0") {
EPF = (rd_1["EPF"].ToString());
int g=1;
Response.Write ("Employee :"+ rd_1["EPF"] +" ");
epf = EPF;
while(rd.Read()) // read records
{
if (rd["EPF"].ToString()==epf) {
Response.Write ("(" + g + ") " + rd["Record"] + "<br>");
}
g++;
}
}
k++;
}
connection.Close();
connection_1.Close();
}
}
}- Changed type KareninstructorMVP Thursday, February 7, 2019 8:57 PM This is a question
- Moved by Wendy ZangMicrosoft contingent staff Tuesday, February 12, 2019 6:24 AM related to web
Thursday, February 7, 2019 5:05 PM
All replies
-
Maybe you should reorganise the program:
OleDbDataReader rd_1 = cmd_1.ExecuteReader();
while(rd_1.Read())
{
if ( rd_1["FileSize"].ToString() != "0")
{
OleDbDataReader rd = cmd.ExecuteReader();
while(rd.Read())
{
. . .
}
}
}
Using parameterised queries, WHERE with more conditions, and “linked tables” will be probably an improvement.
- Edited by Viorel_MVP Thursday, February 7, 2019 6:37 PM
- Proposed as answer by Wendy ZangMicrosoft contingent staff Monday, February 11, 2019 3:08 AM
Thursday, February 7, 2019 6:35 PM -
Please post code using the code block button.
Please remember to mark the replies as answers if they help and unmark them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.
VB Forums - moderator
Thursday, February 7, 2019 8:57 PM -
After the first time through the outer loop, rd will have read all the way to the end. So the next time, there will be nothing left for it to read and the inner loop will not execute at all.
You need to get a new rd by calling ExecuteReader every time through the outer loop.
Friday, February 8, 2019 1:01 AM