Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while READ()中有foreach循环的奇怪行为_C#_Sql_Sql Server - Fatal编程技术网

C# while READ()中有foreach循环的奇怪行为

C# while READ()中有foreach循环的奇怪行为,c#,sql,sql-server,C#,Sql,Sql Server,我是一名VFP开发人员,正在尝试学习C。考虑到最快的学习方式是通过实践,我给了自己一个小项目来练习 目标 将一些事务从“实时”数据库移动到存档数据库中 总的想法是: 获取“合适”作业(父项)的列表,然后逐个读取 一个 使用foreach循环处理子表列表,插入 历史数据库中的新记录,然后删除旧记录 从“实时”表中 将实际作业(父项)移动到存档,然后将其从“活动”中删除 一开始一切顺利,然后我突然撞上了一堵砖墙 问题 我有一个名为RefCombo的变量,用于存储父级的主键,它存储在while(R

我是一名VFP开发人员,正在尝试学习C。考虑到最快的学习方式是通过实践,我给了自己一个小项目来练习

目标

将一些事务从“实时”数据库移动到存档数据库中

总的想法是:

  • 获取“合适”作业(父项)的列表,然后逐个读取 一个
  • 使用foreach循环处理子表列表,插入 历史数据库中的新记录,然后删除旧记录 从“实时”表中
  • 将实际作业(父项)移动到存档,然后将其从“活动”中删除
一开始一切顺利,然后我突然撞上了一堵砖墙

问题

我有一个名为RefCombo的变量,用于存储父级的主键,它存储在
while(READ())
语句之后,就在
foreach
循环之前

在包含四条记录的测试数据库中,RefCombo字段应为:

while read()结果:Job1

预定义列表中的foreach childtable

  • 过程表1

  • 过程表2

  • 过程表3

  • 过程表4

  • 过程表5

然后重复作业2、作业3和作业4

让我发疯的是我得到了这个:

while read()结果:Job1

预定义列表中的foreach childtable

  • 过程表1

  • 跳过其他子表,RefCombo(主键)变为Job2,在read()时循环回

问题是,一旦它更改为Job2,它就会像我预期的那样继续工作,为每个剩余的父记录遍历每个子表


我还收到一个“当前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)