VBA Connexion de Base de données
Comment changer le code ci-dessous afin d'éviter ce que vous voyez dans la capture d'écran.
Je suis en cours d'exécution d'une macro avec le code suivant
Dim conn As ADODB.Connection
Dim rec1 As ADODB.Recordset
Dim thisSql As String
Set conn = New ADODB.Connection
Dim sConn As String
sConn = "Provider=SQLOLEDB;Trusted_Connection=Yes;Server=xyz;Database=xyz;UID=xyz;PWD=xyz"
conn.Open sConn
' this is creating multiple connections.
Set rec1 = New ADODB.Recordset
rec1.Open thisSql, conn
qui exécute une requête SQL Server (qui est d'environ 20 lignes de long et contient 4 joint). Tout est bien sauf pour le fait que, après quelques temps de marche, il ma DB admin dit que ma requête est le chargement de la base de données trop.
Maintenant, ma requête pourrait être à l'origine du problème, ou peut-être que Excel est de commencer à exécuter plusieurs connexions à la fois. Certains éléments de preuve pour ce qui est de la capture d'écran ci-dessous et le fait que la charge sur la base de données semble augmenter avec le temps.
Comment puis-je établir une connexion DB sans cesse créer de nouvelles connexions?
Quelqu'un a eu le même problème à travailler avec Excel DB macros?
Mise à JOUR
Même si les réponses ci-dessous ont été très utiles (surtout pour quelqu'un débutant en VBA), il semble que la principale raison de ma requête a été prise de charge a été une combinaison de plusieurs connexions et d'avoir sauté une ligne dans mon code:
With Sheets("FVols").QueryTables.Add(Connection:=rec1, Destination:=Sheets("FVols").Range("A1"))
.name = "data"
.FieldNames = True
.Refresh BackgroundQuery:=True <<<<<<<<<<<<<<<<<<<<<<<-----
End With
Je l'ai écrit dans le connecticut.Fermer à la fin, mais encore, elle crée de nouvelles connexions (rec1.Fermer les accidents de la macro). Est-il autre chose que je dois fermer?
OriginalL'auteur frickskit | 2013-08-19
Vous devez vous connecter pour publier un commentaire.
Vous avez seulement besoin d'ouvrir la connexion à la fois. Qui, littéralement, signifie que vous pouvez exécuter plusieurs requêtes sur une connexion active. Vous devez fermer la connexion et libre de référence (spécialement avec ADODB) pour éviter les collisions et autres problèmes liés à la connexion.
Si vous connaissez les requêtes que vous allez être en cours d'exécution, vous pouvez créer un tableau (ou de la collection) et ajouter des requêtes à la file d'attente.
Alors que vous avez déjà une connexion ouverte pour travailler avec, vous pouvez garder l'exécution des requêtes.
Scan de code il n'y a pas beaucoup de différence entre le tien et le mien, donc vous devriez être capable de voir ce qui se passe et où. S'il vous plaît, de poser des questions dans les commentaires si quelque chose n'est pas clair
Maintenant, vous avez seulement besoin d'exécuter le
DBConnection()
une fois et toutes les requêtes que vous avez énumérés dans le tableau sera exécuté.Par ailleurs, si les requêtes sont créées au moment de l'exécution, vous pouvez le passer à la
DbConnection()
en tant que paramètre.Mise à jour:
Vous pouvez déclarer votre connexion en tant que Variable Globale. Vous pouvez maintenant exécuter le
DBConnection()
autant de fois que vous le souhaitez et vous n'allez pas créer une nouvelle connexion à chaque fois. Au lieu de cela, vous serez à l'aide de l'objet de connexion global.ok, je vois maintenant. J'ai mis à jour ma réponse, un coup d'oeil
OriginalL'auteur
Êtes-vous en libérant la variable de connexion lorsque vous avez fini avec elle? c'est à dire
La connexion ne se referment pas complètement si ce n'.
OriginalL'auteur ZenSquirrel