目前正在使用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不断崩溃,我我不知道如何解决这个问题,正如我所说,也许一些更有经验的人可以帮助我并解释如何解决这个问题。
编辑:谢谢大家的帮助,我也在微软网站上偶然发现了这个问题,这是一种更有效的方式:再次感谢你们给予的帮助!
答案 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