2010-07-15 3 views
1

Je rencontre un problème avec les tables temporaires utilisant une connexion ADO à ma base de données. Les sélections dans les requêtes s'exécutent correctement, mais il semble qu'elles abandonnent les tables après chaque sélection. Ce n'est pas un jeu d'enregistrements ouvert, donc je ne suis pas sûr de savoir pourquoi les tables sont en baisse, il ne devrait pas être l'ouverture d'une deuxième connexion ADO que je peux voir. Une idée de ce que je peux faire pour empêcher les tables temporaires de tomber?L'utilisation de plusieurs tables temporaires dans Delphi avec une connexion ADO à la base de données génère des erreurs

begin 
    // Get Data 


    // Build the work tables for case and claims 
    // Find CasemmyyyyEOM for prior month 
    // 

    begin 
     cmd := TStringList.Create; 
     cmd.Add(
      'select casenumber, fundsavail, totalrcpts, totalobjectn, totaldisbursed, confirmdate, confirmcode into #casemasterwork from CaseMaster'); 

     cmd.Add(
      'select caseid, claimnumber, splitcode, prinpdtodate, intpdtodate into #claimswork from claims'); 
     fConnection.Execute(cmd.text); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     cmd.Free; 

     // Sum up receipts posted after end of month 
     cmd := TStringList.Create; 
     cmd.Add(
      'select rcpthistcasekey, amount = sum(rcpthistamt) into #rcpts from rcptshist where '); 
     If cbxRunbyDate.Checked = False then 
      cmd.Add('substring(rcpthistinputid,1,4) > ''' + copy(sJrnlYM, 3, 
        4) + ''' And rcpthisttrandate > ''' + sMonthBegin + '''') 
     Else 
      cmd.Add(' rcpthisttrandate > ''' + sMonthEnd + ''' '); 
     cmd.Add(' group by rcpthistcasekey'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // Sum up disbursements by case posted after end of month 
     cmd := TStringList.Create; 
     cmd.Add(
      'select disbcasekey, amount = sum(disbprinamt + disbintamt) into #disb from disbursed where '); 
     If cbxRunbyDate.Checked = False then 
      cmd.Add('disbrunyrmo > ''' + sJrnlYM + '''') 
     Else 
      cmd.Add('DisbTrDate > ''' + sMonthEnd + ''''); 
     cmd.Add('group by disbcasekey'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // Sum up disbursements by case/claim posted after end of month 
     cmd := TStringList.Create; 
     cmd.Add(
      'select disbcasekey, disbclaimnum, prinamt = sum(disbprinamt), intamt = sum(disbintamt) into #clmdisb from disbursed where'); 
     If cbxRunbyDate.Checked = False then 
      cmd.Add('disbrunyrmo > ''' + sJrnlYM + '''') 
     Else 
      cmd.Add('DisbTrDate > ''' + sMonthEnd + ''''); 
     cmd.Add('group by disbcasekey, disbclaimnum'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // back out the disbursements from the claims work table 
     cmd := TStringList.Create; 
     cmd.Add('update #claimswork set prinpdtodate = prinpdtodate - prinamt, intpdtodate = intpdtodate - intamt from #clmdisb'); 
     cmd.Add('where disbcasekey = caseid and disbclaimnum = claimnumber + splitcode'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // back out the disbursements from the casemaster work table 
     cmd := TStringList.Create; 
     cmd.Add(
      'update #casemasterwork set fundsavail = fundsavail - amount, totalrcpts = totalrcpts - amount from #rcpts'); 
     cmd.Add('where casenumber = rcpthistcasekey'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // back out the receipts from the casemaster work table 
     cmd := TStringList.Create; 
     cmd.Add(
      'update #casemasterwork set fundsavail= fundsavail + amount, totaldisbursed = totaldisbursed - amount from #disb'); 
     cmd.Add('where casenumber = disbcasekey'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     fConnection.Execute(cmd.text); 
     cmd.Free; 

     // Set the confirmcode based on the confirm transfer table 
     Try 

      cmd := TStringList.Create; 
      cmd.Add('update #casemasterwork set confirmcode = ''U'''); 
      cmd.Add(
       'from confirmdxfer, #casemasterwork where #casemasterwork.casenumber = confirmdxfer.casenumber'); 
      cmd.Add('and xferdate > ''' + sMonthEnd + ''''); 
      // del 11-28-2004 ebs readded 10/25/2005 esatori 
      // cmd.Add('and xferdate between ''' + sMonthBegin + ''' and ''' + sMonthEnd + ''' '); // 11-28-2004 ebs 
{$IFDEF DEBUG} 
      MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
      fConnection.Execute(cmd.text); 
      cmd.Free; 
     Except 
     End; 

     cmd := TStringList.Create; 
     cmd.Add('select TotRcpts = sum(amount) from #rcpts'); 
{$IFDEF DEBUG} 
     MessageLog(cmd.text, 'Query'); 
{$ENDIF} 
     rs := fConnection.Execute(cmd.text); 
     cmd.Free; 
     rs.MoveFirst; 
     cTotalCurRcpts := rs.Fields.Item('TotRcpts').Value; 
     rs.Close; 
+0

Comment configurez-vous votre objet fConnection? Personnellement, j'essaierais de le faire sans toutes les tables temporaires. –

+0

donc vous dites quand vous arrivez à la fin de ce code et essayez d'exécuter la requête "SELECT TotRcpts = Sum (Amount) de #rcpts" la table temporaire n'est plus là pour vous de choisir? – Leslie

+0

@Tom H: la fConnexion est déclarée lors de la création du formulaire. J'adorerais le faire sans tables temporaires, cela a été précédemment écrit pour utiliser une connexion BDE et le code est environ 4x aussi longtemps que l'échantillon, donc je ne veux vraiment pas le réécrire. @Leslie: la première erreur se produit dans l'exécution de "UPDATE #claimswork ..." Je reçois la table #clmdisb n'est plus valide, qui est la table contenant les données pour mettre à jour #claimswork. J'ai inclus un peu plus de code que nécessaire pour donner une image plus grande – JamesW

Répondre

2

Après de nombreuses recherches sur ce sujet, j'ai trouvé la réponse. ADO a tendance à ouvrir une deuxième connexion cachée à la base de données. Pour éviter cela, assurez-vous que tous les jeux d'enregistrements sont fermés avant l'exécution des tables temporaires et assurez-vous de fermer tout jeu d'enregistrements utilisé dans la logique de la table temporaire.

0

Plutôt que de laisser "sélectionner ... dans #temptable ..." créer implicitement la table temporaire, essayez d'exécuter une instruction SQL pour créer explicitement la première table "create table #temptable (...)" , puis référencez ces tables dans vos insertions et mises à jour.

2

Mes connaissances Delphi sont très, très anciennes - y a-t-il une chance que cela utilise n'importe quel type de connexion? Vous pouvez vérifier en exécutant EXEC sp_who2 et en vérifiant s'il existe plusieurs connexions depuis votre application.

Si vous êtes sûr à 100% qu'une seule de ces opérations s'exécutera à la fois, passez les tables temporaires de #casemasterwork à ## casemasterwork cela en fera des tables temporaires globales et donc accessibles depuis n'importe quelle connexion.

N'oubliez pas de les déposer!

0

La propriété fConnection.KeepConnection est-elle définie sur True? Sinon, c'est votre problème. (En supposant que fConnection est un TADOConnection)

Le code ci-dessus est-il le code réel utilisé? Utilisez-vous des requêtes paramétrées? Si c'est le cas, c'est un autre problème avec un article de Microsoft KB dessus.

Questions connexes