无尽的循环崩溃VShost

时间:2015-08-04 16:41:19

标签: c# sql

目前正在使用VS2013,而我正在尝试做的是在某个条件为真时更新表上的最后一个条目,但是,我解决此问题的方法无法正常工作,因为它崩溃了VShost。我决定也许一些经验丰富的眼睛会以更好的方式看到问题并帮助我,代码就是这样:

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("A apagar dados...");
    bool check = true;
    do
    {
        string connectionString;
        var path = @"C:\Users\Administrator\Desktop\connstring.txt";
        using (StreamReader sr = new StreamReader(path))
        {
            connectionString = sr.ReadLine();
        }

        var connection = new SqlConnection(connectionString);

        string queryString = string.Empty;
        using (SqlConnection deleteconnection = new SqlConnection(connectionString))
        {
            deleteconnection.Open();
            connection.Open();
            queryString = "DELETE FROM wgcdoccab WHERE numdoc = (SELECT MAX(numdoc) FROM WGCDOCCAB WHERE serie ='1' and tipodoc ='FSS' and contribuinte ='999999990' and  datadoc = CONVERT(varchar(10),dateadd(dd, -1, getdate()),120))";
            SqlCommand command = new SqlCommand(queryString, connection);
            command.ExecuteNonQuery();
            connection.Close();
        }
        using (SqlConnection deleteconnection = new SqlConnection(connectionString))
        {
            connection.Open();
            deleteconnection.Open();

            queryString = "SELECT max(numdoc) FROM wgcdoccab WHERE serie ='1' and tipodoc ='FSS' and contribuinte ='999999990' and datadoc = CONVERT(varchar(10),(dateadd(dd, -1, getdate())), 120))";
            using (SqlCommand command = new SqlCommand(queryString, connection))
            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    check = true;
                }
                else
                {
                    check = false;
                    MessageBox.Show("Dados Apagados com sucesso");
                }
                command.Connection.Close();
            }
        }
    }
    while (check);

单击按钮后,连接打开,查询运行并假设在满足条件时逐个更新表中的条目,然后在条件为false时停止,但VShost不断崩溃,我我不知道如何解决这个问题,正如我所说,也许一些更有经验的人可以帮助我并解释如何解决这个问题。

编辑:谢谢大家的帮助,我也在微软网站上偶然发现了这个问题,这是一种更有效的方式:

  

https://support.microsoft.com/en-us/kb/111401

再次感谢你们给予的帮助!

2 个答案:

答案 0 :(得分:3)

问题必须是你的

queryString = "SELECT max(numdoc) FROM wgcdoccab ..."

查询将始终至少有一行。这将使check变量永远不会将自己设置为false,这会导致循环永远不会停止。 我认为您的代码中根本不需要do{ } while (condtion);check变量。

如果我错了,请在SELECT max( ...声明中纠正我。我尝试在SQL Server管理器中,如果没有符合我的条件,由于max(...)函数,我仍然得到一行包含NULL,没有max函数,我在结果中没有行< / p>

我希望它可以帮到你。快乐的调试!

干杯!

答案 1 :(得分:1)

正如@DDan所提到的,来自max()的返回集将始终返回具有行的内容(如果没有满足条件,则返回NULL行)。这意味着reader.HasRows始终为真,因此check永远不会false导致无限循环问题。

然而,看看你的代码,你似乎要做的是:

  • 从数据库中删除行
  • 确保已将其删除并显示“删除成功”消息框

如果是这种情况,那么您根本不需要第二个using(SQLConnection deleteconnect...块。

DELETE中执行Try/Catch命令以处理任何错误,并在try块内执行后显示MessageBox

但是,如果您确实想要SELECT来确保删除的内容实际已删除,则需要执行以下操作:

执行Select max(numdoc) FROM wgcdoccab...并将结果保存到变量,例如recordToDelete

然后运行DELETE FROM wgcdoccab WHERE numdoc = @recordToDelete

然后运行SELECT numdoc from wgcdoccab WHERE numdoc = @recordToDelete并确保获得0条记录。从那里,您可以显示删除成功MessageBox