嵌套循环和变量范围 [英] nested loops and variable scope

查看:65
本文介绍了嵌套循环和变量范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了以下代码 阅读数据并显示 来自两个访问文件,   "雇员"和"记录"使用两个嵌套循环。 (两个数据表都有一列"EPF") 首先从"员工"中读取员工
号码,然后来自"记录"的相应记录。文件。当我运行该程序时,它只提供与第一个员工相关的记录(即与第一个EPF号码相关的记录。)请帮我解决问题。



使用System.Collections;

使用System.Configuration;

使用System.ComponentModel;

使用System.Data.SqlClient;

使用System.Drawing;

使用System .Web.SessionState;

使用System.Text;

使用System;

使用System.Web;

使用System.Web.UI;
$
使用System.Web.UI.WebControls;

使用System.Web.UI.HtmlControls;

使用System.IO;
$
使用System.Data;

使用System.Data.OleDb;



命名空间viewevent

{

///< summary>

/// ViewImage的摘要说明。

// /< / summary>

公共类ViewImage:System.Web.UI.Page

< span style ="white-space:pre"> {

   
$


private void Page_Load(object sender,System.EventArgs e)

{

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //为两个数据库构建我们的查询语句



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string ConnectionString_1 =" Provider = Microsoft.Jet.OLEDB.4.0;数据来源=" + MapPath(" employee.mdb");

OleDbConnection connection_1 = new OleDbConnection(ConnectionString_1);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string ConnectionString =" Provider = Microsoft.Jet.OLEDB.4.0;数据来源=" + MapPath(" records.mdb");

OleDbConnection connection = new OleDbConnection(ConnectionString);



//打开数据库,获取两个数据库的datareader

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; connection_1.Open();

connection.Open();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string SQL_1;

string SQL;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SQL_1 =" SELECT * from file where Category ='ph'order by EPF asc" ;;

SQL =" SELECT *来自EPF asc" ;; $
$
 的文件,其中Category ='ph'的订单&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; 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();
$


  &NBSP; &NBSP; &NBSP;   string EPF,epf;

  &NBSP; &NBSP; &NBSP;   int k = 0;    //记录计数器



$
 而(rd_1.Read())&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //读取员工

  &NBSP; &NBSP; &NBSP; {&NBSP; &NBSP; &NBSP;  

  &NBSP; &NBSP;   if(rd_1 [" FileSize"]。ToString()!=" 0"){ 

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; EPF =(rd_1 [" EPF"]。ToString());

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   int g = 1;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Response.Write(" Employee:" + rd_1 [" EPF"] +""); 

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; epf = EPF;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;而(rd.Read())&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //读取记录

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   { 

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   if(rd [" EPF"]。ToString()== epf){

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   Response.Write("(" + g +")" +   rd [" Record"] 
  +"< br>");  



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;  }
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; g ++;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;  }



$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;}&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

  &NBSP; &NBSP; &NBSP;   k ++; 



  &NBSP; &NBSP;  }
$


  &NBSP; &NBSP; &NBSP; &NBSP;   connection.Close();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; connection_1.Close();&NBSP;  



$
}







  &NBSP; &NBSP; }


}


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP;
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;
  &NBSP; &NBSP; &NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;&NBSP;&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

解决方案

也许您应该重新组织该计划:


 


OleDbDataReader rd_1 = cmd_1 .ExecuteReader();


while(rd_1.Read())


{


   if(rd_1 [" FileSize"]。ToString()!=" 0")


   {


      OleDbDataReader rd = cmd.ExecuteReader();


  &NBSP;&NBSP;&NBSP;&NBSP; while(rd.Read())


   ;&NBSP;&NBSP;&NBSP; {


      &NBSP;&NBSP;&NBSP;
。 。 。


      }


   }


}


 


使用参数化查询, WHERE 具有更多条件,"链接表"可能会有所改进。





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


}



      }

}

                                                                                                                                                                                                                                                                                                                                     

解决方案

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.



这篇关于嵌套循环和变量范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆