Azure – SqlBulkCopy lançant une exception de timeout expiré

J'utilise une database sql azuree (v12) sur un vm. J'ai deux instances de bases de données différentes – une pour la mise en scène et l'autre pour la production. J'essaie d'extraire datatables de la mise en scène et de les insert dans la production en cliquant sur un button. Ce code fonctionne avec succès "parfois", ce qui signifie au hasard qu'il sera couronné de succès. Sinon, je reçois une erreur de:

BULK COPY Commit Exception Type: {0} System.Data.SqlClient.SqlException BULK COPY Message: {0} Expiration du timeout. Le timeout d'expiration s'est écoulé avant la fin de l'opération ou le server ne répond pas. Cette erreur s'est produite lors de la tentative de connection à la destination de routing. La durée passée lors de la tentative de connection au server d'origine était – Initialisation [Pre-Login] = 1; poignée de main = 17; [Login] initialisation = 0; authentification = 0; [Post-connection] complete = 0;

Voici le code que j'utilise pour accomplir cette tâche, peut-être qu'il y a un défaut que je ne vois pas. En vidant le SsortingngBuilder je peux voir que la requête SELECT fonctionne et la requête DELETE fonctionne mais l'erreur est levée lorsque je tente de copyr datatables en utilisant SqlBulkCopy. Toute aide serait grandement appréciée. J'ai déjà passé un tas de documents MSDN sans aucune chance -> en ajoutant des CommandTimeouts plus longs, en ajoutant un BulkCopyTimeout plus long et en reconfigurant les ports sur mon pare-feu. Toujours pas de chance.

Ressources que j'ai utilisées: https://social.msdn.microsoft.com/Forums/en-US/1467d64f-69ae-4c1f-91a2-349fc5d514ae/sqlbulkcopy-fails-with-timeout-expired-error?forum=adodotnetdataproviders

https://azuree.microsoft.com/nb-no/documentation/articles/sql-database-develop-direct-route-ports-adonet-v12/

Le timeout d'attente a expiré avec SqlBulkCopy

public static object SyncData() { SsortingngBuilder sb = new SsortingngBuilder(); sb.AppendLine("Internal Connection..."); ssortingng internalConnectionSsortingng = GetConnectionSsortingng("ConnectionSsortingng"); using (SqlConnection internalConnection = new SqlConnection(internalConnectionSsortingng)) { internalConnection.Open(); SqlCommand selectCommand = internalConnection.CreateCommand(); selectCommand.CommandTimeout = 180; try { selectCommand.CommandText = "SELECT * FROM dbo.test"; SqlDataReader reader = selectCommand.ExecuteReader(); sb.AppendLine("External Connection..."); ssortingng externalConnectionSsortingng = GetConnectionSsortingng("ExternalConnectionSsortingng"); using (SqlConnection externalConnection = new SqlConnection(externalConnectionSsortingng)) { externalConnection.Open(); SqlCommand CRUDCommand = externalConnection.CreateCommand(); CRUDCommand.CommandTimeout = 180; SqlTransaction transaction = externalConnection.BeginTransaction("test"); CRUDCommand.Connection = externalConnection; CRUDCommand.Transaction = transaction; try { CRUDCommand.CommandText = "DELETE FROM dbo.test"; sb.AppendLine("DELETE: Number of rows affected = " + CRUDCommand.ExecuteNonQuery()); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(externalConnection, SqlBulkCopyOptions.KeepIdentity, transaction)) { try { bulkCopy.DestinationTableName = "dbo.test"; bulkCopy.BatchSize = 100; bulkCopy.BulkCopyTimeout = 180; bulkCopy.WriteToServer(reader); sb.AppendLine("Table data copyd successfully"); transaction.Commit(); sb.AppendLine("Transaction committed."); } catch (Exception ex) { sb.AppendLine("BULK COPY Commit Exception Type: {0}" + ex.GetType()); sb.AppendLine(" BULK COPY Message: {0}" + ex.Message); try { transaction.Rollback(); } catch (Exception ex2) { sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType()); sb.AppendLine(" Message: {0}" + ex2.Message); } } finally { reader.Close(); } } } catch (Exception ex) { sb.AppendLine("Commit Exception Type: {0}" + ex.GetType()); sb.AppendLine(" Message: {0}" + ex.Message); try { transaction.Rollback(); } catch (Exception ex2) { sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType()); sb.AppendLine(" Message: {0}" + ex2.Message); } } } } catch (Exception ex) { sb.AppendLine("Commit Exception Type: {0}" + ex.GetType()); sb.AppendLine(" Message: {0}" + ex.Message); } } return sb.ToSsortingng(); } 

Lors de la création de votre instance SqlBulkCopy, vous passez la string de connection externalConnectionSsortingng et vous ouvrez ainsi une nouvelle connection. Cela peut provoquer un problème d'interblocage avec les deux connections essayant de modifier la même table.

Avez-vous essayé de transmettre votre connection existante externalConnection au constructor SqlBulkCopy au lieu de la string de connection?