Domanda

Sto cercando di eseguire due istruzioni SQL (MSSQL 2005), in modo asincrono in un operaio di sfondo. Tuttavia, quando chiamo il metodo EndExecuteNonQuery al primo SqlCommand ho un 'errore di sintassi SQL vicino a' errore.

Ecco il mio codice:

try
{
    SqlCommand sqlCmd = uow.DataLayer.CreateCommand() as SqlCommand;
    sqlCmd.CommandText = "DELETE FROM dbo.EligibilityRecordKeyValue WHERE EligibilityRecord IN " +
    "(SELECT EligibilityRecord FROM dbo.EligibilityRecord WHERE Organization = '" + map.Organization.Oid + "')";
    IAsyncResult result = sqlCmd.BeginExecuteNonQuery();
    while (!result.IsCompleted)
    {
        worker.ReportProgress(0, "Deleting existing record keys");
        System.Threading.Thread.Sleep(200);
    }
    count = sqlCmd.EndExecuteNonQuery(result);
}
catch (SqlException ex)
{
}
catch (InvalidOperationException ex)
{
}
finally
{
    worker.ReportProgress(2, String.Format("Existing {0} records keys deleted.", count));
}

try
{
    SqlCommand sqlCmd = uow.DataLayer.CreateCommand() as SqlCommand;
    sqlCmd.CommandText = "DELETE FROM dbo.EligibilityRecord WHERE Organization = '" +      map.Organization.Oid + "'";
    IAsyncResult result = sqlCmd.BeginExecuteNonQuery();
    while (!result.IsCompleted)
    {
        worker.ReportProgress(0, "Deleting existing records");
        System.Threading.Thread.Sleep(200);
    }
    count = sqlCmd.EndExecuteNonQuery(result);
}
catch (SqlException ex)
{
}
catch (InvalidOperationException ex)
{
}
finally
{
    worker.ReportProgress(5, String.Format("Existing {0} records deleted.", count));
}

Non riesce al primo count = sqlCmd.EndExecuteNonQuery(result);

È stato utile?

Soluzione

Ok, aggiungendo WAITFOR di ritardo per entrambi i comandi SQL sembra aver risolto il problema.

sqlCmd.CommandText = String.Format("WAITFOR DELAY '00:00:05'; DELETE FROM dbo.EligibilityRecordKeyValue WHERE EligibilityRecord IN " + 
                    "(SELECT EligibilityRecord FROM dbo.EligibilityRecord WHERE Organization = '{0}')", map.Organization.Oid);

sqlCmd.CommandText = String.Format("WAITFOR DELAY '00:00:05'; DELETE FROM dbo.EligibilityRecord WHERE Organization = '{0}'", map.Organization.Oid);

Qualcuno sa perché questo accade?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top