无限循环崩溃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再次感谢你们所有人给予的帮助!
问题一定是你的
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