Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# 循环删除查询的最佳方式是什么_C#_Sql - Fatal编程技术网

C# 循环删除查询的最佳方式是什么

C# 循环删除查询的最佳方式是什么,c#,sql,C#,Sql,我一直在尝试根据一定数量的限制逐个删除几行,我只尝试删除最新的条目。然而,我提出的解决方案不断使VSHOST崩溃,有没有更好的方法来实现相同的结果 private void button1_Click(object sender, EventArgs e) { MessageBox.Show("A apagar dados..."); bool check = true; do { string connectionString;

我一直在尝试根据一定数量的限制逐个删除几行,我只尝试删除最新的条目。然而,我提出的解决方案不断使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);
代码相对简单,在do-while结束后,它变成了一个无休止的循环,因为它总是为numdoc返回一个NULL值,我似乎找不到解决它的方法。
有什么建议吗?

我不明白循环的必要性。你为什么不一次删除所有的记录呢

DELETE FROM wgcdoccab
WHERE 
    serie ='1' and
    tipodoc ='FSS' and
    contribuinte ='999999990' and
    datadoc = CONVERT(varchar(10),dateadd(dd, -1, getdate()),120))";
如果在循环中重复查询,它将删除所有这些记录,而不仅仅是最后的记录

“最后一个”到底是什么意思?最后两个最后100个?你必须给出“最后一个”的确切定义

假设您要删除最后10个。您可以通过以下查询实现它(假设使用T-SQL):


MAX()将始终返回null,而不是空行。为什么不检查空值呢?我不想删除所有的行,只想删除符合子句的行,例如“Where numdoc(max)等”,因此我需要从底部逐个检查,直到表中的值为false,抱歉,如果我解释得不太清楚。如果您重复删除与where条件匹配的行,直到没有一行保留下来,那么您是否先删除带有MAX(numdoc)的行没有任何区别。它们中的每一个都会依次在你的循环中有
numdoc=MAX(numdoc)
,因为
MAX(numdoc)
每次都是另一个。但我只想删除前一天条件为真的最后一个,而不是全部,而条件为真删除,如果没有,请停止删除并保留其余的。如果条件为真,则每个条件都将是最后一个条件,因为删除最后一个条件后,另一个条件将是最后一个条件。我的第一个查询只删除前一天条件为true的查询。使用
MAX(numdoc)
没有什么区别。我现在明白了!还有一个问题,如果我选择了最后的前100名,但最后只有99个条目,它会下载99个条目还是崩溃?
DELETE FROM wgcdoccab
WHERE numdoc IN (
    SELECT TOP 10 numdoc
    FROM WGCDOCCAB
    WHERE blahh blahh blahh
    ODER BY numdoc DESC
)