无限循环崩溃VShost

本文关键字:VShost 崩溃 无限循环 | 更新日期: 2023-09-27 18:06:15

目前使用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);

按钮被点击后,连接打开,查询运行,据说更新表上的条目一个接一个,因为它们符合条件,然后停止,当它的条件是假的,但是VShost不断崩溃,我不知道如何解决这个问题,因为我说也许一些更有经验的是可以帮助我,给我一个关于如何解决问题的解释。

编辑:谢谢大家的帮助,我也是在微软网站上偶然发现的,这是一个更有效的方法:
https://support.microsoft.com/en-us/kb/111401

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

无限循环崩溃VShost

问题一定是你的

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

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

纠正我的SELECT max(…如果我错了。我在SQL Server管理器中尝试过,如果没有行满足我的条件,因为max(...)函数,我仍然得到一个包含NULL的行,没有max函数,我在结果中没有行

我希望它能帮助你。调试快乐!

干杯!

正如@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