嵌套循环和变量范围 [英] nested loops and variable scope
问题描述
我使用了以下代码 阅读数据并显示 来自两个访问文件,  "雇员"和"记录"使用两个嵌套循环。 (两个数据表都有一列"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屋!