C# while READ()中有foreach循环的奇怪行为
我是一名VFP开发人员,正在尝试学习C。考虑到最快的学习方式是通过实践,我给了自己一个小项目来练习 目标 将一些事务从“实时”数据库移动到存档数据库中 总的想法是:C# while READ()中有foreach循环的奇怪行为,c#,sql,sql-server,C#,Sql,Sql Server,我是一名VFP开发人员,正在尝试学习C。考虑到最快的学习方式是通过实践,我给了自己一个小项目来练习 目标 将一些事务从“实时”数据库移动到存档数据库中 总的想法是: 获取“合适”作业(父项)的列表,然后逐个读取 一个 使用foreach循环处理子表列表,插入 历史数据库中的新记录,然后删除旧记录 从“实时”表中 将实际作业(父项)移动到存档,然后将其从“活动”中删除 一开始一切顺利,然后我突然撞上了一堵砖墙 问题 我有一个名为RefCombo的变量,用于存储父级的主键,它存储在while(R
- 获取“合适”作业(父项)的列表,然后逐个读取 一个
- 使用foreach循环处理子表列表,插入 历史数据库中的新记录,然后删除旧记录 从“实时”表中
- 将实际作业(父项)移动到存档,然后将其从“活动”中删除
while(READ())
语句之后,就在foreach
循环之前
在包含四条记录的测试数据库中,RefCombo字段应为:
while read()结果:Job1
预定义列表中的foreach childtable
- 过程表1
- 过程表2
- 过程表3
- 过程表4
- 过程表5
- 过程表1
- 跳过其他子表,RefCombo(主键)变为Job2,在read()时循环回
我还收到一个“当前TransactionScope已完成”错误,每隔一次我运行网页时都会出现该错误。这发生在程序开始时的
connection.open()
部分,但很难确定,因为它不是一直发生的
我已经在底部发布了代码,它有点长,只是随便看一眼,但是如果有任何帮助,我将不胜感激。我已经做了两天了,真的不能再掉头发了,哈哈
对我的代码的任何评论都会更受欢迎,我对C#真的很陌生,每一点都有帮助:p
提前谢谢
#region Declaration
DateTime FromDate = Convert.ToDateTime("01/01/2011");
DateTime ToDate = Convert.ToDateTime("01/03/2011");
string conStrSource = @"Data Source=HOME\SQLEXPRESS;Initial Catalog=MCC_Live;Integrated Security=True";
// Declare a list of child tables to check and move together with the Job
List<String> TablesToMove = new List<String>();
{
TablesToMove.Add("JobItems");
TablesToMove.Add("JobTerms");
TablesToMove.Add("JobMessages");
TablesToMove.Add("JobCalcs");
TablesToMove.Add("JobContainers");
TablesToMove.Add("JobMetrics");
}
#endregion
#region Set SQL String
string QueryString =
"SELECT " +
"JobMaster.BranchID, JobMaster.JobNo, " +
"JobMaster.ImportDate, PermitStatus.CurrentStatus " +
"FROM JobMaster. " +
"INNER JOIN PermitStatus ON " +
"JobMaster.BranchID = PermitStatus.BranchID AND " +
"JobMaster.JobNo = PermitStatus.JobNo " +
"WHERE " +
"(JobMaster.ImportDate BETWEEN @FromDate AND @ToDate) AND " +
"PermitStatus.currentStatus NOT IN ('HT0', 'HT1', 'HT2')";
#endregion
// Display on web page for reference
ASPxFromDate.Value = FromDate;
ASPxToDate.Value = ToDate;
ASPxMemo1.Value = QueryString;
#region Open Connection, Get List of filtered Master Jobs
using (SqlConnection connection = new SqlConnection(conStrSource))
{
int JobCount = 0;
ASPxListBox1.Items.Clear();
ASPxListBox2.Items.Clear();
ASPxListBox3.Items.Clear();
ASPxListBox1.Columns.Clear();
SqlCommand command = new SqlCommand(QueryString, connection);
{
command.Parameters.Add(new SqlParameter("@FromDate", FromDate));
command.Parameters.Add(new SqlParameter("@ToDate", ToDate));
}
connection.Open();
SqlDataReader FilteredJobList = command.ExecuteReader();
#endregion
try // Process MasterJob File
{
// Process individual jobs one by one so I won't tie up memory and have better logging
while (FilteredJobList.Read())
{
#region Declare variables
string RefCombo = (string)FilteredJobList[0] + (string)FilteredJobList[1]; //Get primary key
JobCount = JobCount + 1;
ASPxTextBox2.Value = JobCount;
ASPxListBox2.Items.Add(RefCombo);
#endregion
// Start transaction scope
TransactionScope TranScope = new TransactionScope();
{
try
{
// Loop through child tables
foreach (string CurrentTable in TablesToMove)
{
#region Transfer child tables
// update list so I know which part its working on
ASPxListBox1.Items.Add(CurrentTable);
RefCombo = (string)FilteredJobList[0] + (string)FilteredJobList[1];
string RefTableNow = (string)CurrentTable;
bool CancelTrans = false;
MoveChild(ref RefCombo, ref RefTableNow, ref conStrSource, ref CancelTrans);
if (CancelTrans == false)
{ //LogFailure();
break;
}
DelChild(ref RefCombo, ref RefTableNow, ref conStrSource, ref CancelTrans);
if (CancelTrans == false)
{ //LogFailure();
break;
}
#endregion
// Remove remaing entries
//MoveLatestStatus();
//DeleteLatestStatus();
//MoveMasterJob();
//DeleteMasterJob();
//LogSuccess();
TranScope.Complete();
}
catch
{
//LogFailure();
}
}
}
finally
{
FilteredJobList.Close();
}
}
}
//------------------------------------------------------------------------------------------------
private void MoveChild(ref string RefCombo, ref string CurrentTable, ref string conStrSource, ref bool CancelTrans)
{
#region Define Insert String
string InsertSqlString =
"INSERT INTO [MCC_History].[dbo].[" + @CurrentTable + "]" +
" SELECT * FROM [MCC_Live].[dbo].[" + @CurrentTable + "] s" +
" WHERE NOT EXISTS" +
" (SELECT 1 FROM [MCC_History].[dbo].[" + @CurrentTable + "] t2" +
" WHERE t2.BranchID + t2.JobNo = s.BranchID + s.JobNo)" +
" AND s.BranchID + s.JobNo = @RefCombo";
#endregion
#region Open connection and execute query
using (SqlConnection MoveConnect = new SqlConnection(conStrSource))
{
try
{
SqlCommand InsertCommand = new SqlCommand(InsertSqlString, MoveConnect);
{
InsertCommand.Parameters.Add(new SqlParameter("@RefCombo", RefCombo));
}
MoveConnect.Open();
InsertCommand.ExecuteNonQuery();
}
catch
{
CancelTrans = true;
}
}
#endregion
}
//------------------------------------------------------------------------------------------------
private void DeleteChild(ref string RefCombo, ref string CurrentTable, ref string conStrSource, ref bool CancelTrans)
{
#region Define Delete query
string DeleteSqlString =
" DELETE FROM [MCC_Live].[dbo].[" + @CurrentTable + "]" +
" WHERE [MCC_Live].[dbo].[" + @CurrentTable +
"].BranchID + [MCC_DB].[dbo].[" + @CurrentTable + "].JobNo = @RefCombo";
#endregion
#region Execute Delete query
using (SqlConnection MoveConnect = new SqlConnection(conStrSource))
{
try
{
SqlCommand InsertCommand = new SqlCommand(DeleteSqlString, MoveConnect);
{
InsertCommand.Parameters.Add(new SqlParameter("@RefCombo", RefCombo));
}
MoveConnect.Open();
InsertCommand.ExecuteNonQuery();
}
catch
{
CancelTrans = true;
}
}
#endregion
}
#区域声明
DateTime FromDate=转换为日期时间(“2011年1月1日”);
DateTime ToDate=转换为ToDateTime(“2011年3月1日”);
字符串conStrSource=@“数据源=HOME\SQLEXPRESS;初始目录=MCC\u Live;集成安全性=True”;
//声明要与作业一起检查和移动的子表列表
List TABLETOMOVE=新列表();
{
tablettomove.Add(“作业项”);
tablettomove.Add(“工作条款”);
tabletomove.Add(“作业消息”);
tablettomove.Add(“JobCalcs”);
tabletomove.Add(“作业容器”);
tabletomove.Add(“JobMetrics”);
}
#端区
#区域集SQL字符串
字符串查询字符串=
“选择”+
JobMaster.BranchID,JobMaster.JobNo+
JobMaster.ImportDate,PermitStatus.CurrentStatus+
“来自工头。”+
“上的内部联接权限状态”+
“JobMaster.BranchID=PermitStatus.BranchID和”+
“JobMaster.JobNo=PermitStatus.JobNo”+
“哪里”+
“(JobMaster.ImportDate介于@FromDate和@ToDate之间)和”+
“PermitStatus.currentStatus不在('HT0','HT1','HT2')”;
#端区
//在网页上显示以供参考
ASPxFromDate.Value=FromDate;
ASPxToDate.Value=ToDate;
ASPxMemo1.Value=QueryString;
#区域打开连接,获取已筛选主作业的列表
使用(SqlConnection连接=新的SqlConnection(conStrSource))
{
int JobCount=0;
ASPxListBox1.Items.Clear();
ASPxListBox2.Items.Clear();
ASPxListBox3.Items.Clear();
ASPxListBox1.Columns.Clear();
SqlCommand=newsqlcommand(QueryString,connection);
{
Add(新的SqlParameter(“@FromDate”,FromDate));
Add(新的SqlParameter(“@ToDate”,ToDate));
}
connection.Open();
SqlDataReader FilteredJobList=command.ExecuteReader();
#端区
尝试//处理主作业文件
{
//逐个处理单个作业,这样我就不会占用内存,并有更好的日志记录
while(filteredjobst.Read())
{
#区域声明变量
string RefCombo=(string)filteredjablist[0]+(string)filteredjablist[1];//获取主键
作业计数=作业计数+1;
aspxtbox2.Value=作业计数;
ASPxListBox2.Items.Add(RefCombo);
#端区
//启动事务范围
TransactionScope TranScope=新TransactionScope();
{
尝试
{
//循环遍历子表
foreach(TablesToMove中的字符串CurrentTable)
{
#区域转移子表
//更新列表,以便我知道它在哪个部分工作
ASPxListBox1.Items.Add(当前表);
RefCombo=(字符串)FilteredJobList[0]+(字符串)FilteredJobList[1];
string RefTableNow=(string)CurrentTable;
bool CancelTrans=false;
MoveChild(ref-RefCombo、ref-RefTableNow、ref-conStrSource、ref-CancelTrans);
if(CancelTrans==false)
{//LogFailure();
打破
}
DelChild(ref-RefCombo、ref-RefTableNow、ref-conStrSource、ref-CancelTrans);
if(CancelTrans==false)