Avatar billede hrc Mester
12. december 2007 - 10:05 Der er 6 kommentarer og
1 løsning

Dansk MSSQL fejlmeddelelse

Platformene er D2007 og MSSQL 2000 ... og en dansk XP

Programmet jeg arbejder på har tråde kørende der opdaterer bl.a. en scrollbar med billeder. Antager det er disse der giver mig nedenstående fejl.

Når jeg tilføjer et nyt billede til billedelisten dukker denne EOleException op: "Forbindelsen er optaget af resultater fra en anden kommando".

Jeg har forsøgt at oversætte den til noget Google kan bruge, men det er ikke lykkes endnu. Er der nogen der har en engelsk version ... og som evt. har en løsning på fejlen.
Avatar billede arne_v Ekspert
12. december 2007 - 15:23 #1
Fejlen betyder:

du har udfoert query 1
du er igang med at hente resultat fra den query
nu forsoerger du at udfoere en ny query 2

Det maa man ikke.

Muligvis har du laest alle data fra den foerste query men mangler bare et
close/dispose kald.

Naermere kan jeg ikke komme det uden at se kode.
Avatar billede hrc Mester
12. december 2007 - 15:51 #2
Jeg tror det karambolerer med denne tråd. Når min liste skal opdateres fyres der sådan en af for hvert billede. Fejlen opstår når jeg har tilføjet et billede til listen.

procedure TFetchThread.Execute;
var
  i : integer;
  OK : boolean;
  Query : TADOQuery;
begin
  Query := DM.CreateQuery;
  try
    // Føjet til i forbindelse med debugging af fejlen
    Query.CursorLocation := clUseServer; //???
    Query.LockType := ltReadOnly;

    Query.SQL.Text :=
      'select billede'+
      '  from billedercache'+
      '  where (ref = :ref)';
    DM.SetParam(Query.Parameters.ParamByName('ref'),ftInteger,fBillede.BillederCacheRef);

    i := 0; OK := false;
    while not OK and (i < 20) do
    begin
      inc(i);

      Query.Open;
      try
        OK := not Query.Eof;
        if OK then
        begin
          fStream := Query.CreateBlobStream(Query.FieldByName('billede'),bmRead);
          try
            Synchronize(LoadBillede);
          finally
            fStream.Free;
          end;
        end;
      finally
        Query.Close;
      end;

      if not OK then
        sleep(random(100) + 450); // Wait half a second'ish
    end;
    fBillede.Done := OK; // true; // Done, even if timed out
  finally
    Query.Free;
  end;
end;
Avatar billede hrc Mester
12. december 2007 - 15:56 #3
Jeg har også en tråd liggende klar til at fylde billederne ind i en scrollbar når de kommer frem. Den propper billederne i komponenten i den rækkefølge der er defineret i databasen. Dvs. når billede 1 er "Done" fyldes det i komponenten osv.

procedure TFillScrollBoxThread.Execute;
const
  TimeOut_ms = 10000;
var
  i : integer;
  TimeOut : cardinal;
  CritcalSection : TRTLCriticalSection;
begin
  CritcalSection := fBilleder.CritcalSection;
  EnterCriticalSection(CritcalSection);
  try
    fBilleder.ThreadCount := fBilleder.ThreadCount + 1;
  finally
    LeaveCriticalSection(CritcalSection);
  end;

  i := 0; TimeOut := GetTickCount + TimeOut_ms; // Wait 10 max seconds
  while (i <= fBilleder.Count - 1) and (GetTickCount < TimeOut) do
  begin
    fBillede := fBilleder[i];
    if fBillede.Done then
    begin
      inc(i);
      Synchronize(AddToScrollBox);
      TimeOut := GetTickCount + TimeOut_ms; // Reset timeout
    end
    else
      Sleep(0);
  end;

  EnterCriticalSection(CritcalSection);
  try
    fBilleder.ThreadCount := fBilleder.ThreadCount - 1;
  finally
    LeaveCriticalSection(CritcalSection);
  end;
end;
Avatar billede hrc Mester
18. december 2007 - 09:40 #4
Jeg er ikke kommet videre med at hitte den "!# fejl. Der er kun én skrivning og en del læsninger og det burde ikke karambolere. Håbede på en mulighed for at kunne spørge databasen om den måtte opdateres.

Jeg kom dog lidt videre med den !&/#%!/ danske fejlmeddelelse, så læg et svar Arne. Tak for hjælpen.
Avatar billede arne_v Ekspert
18. december 2007 - 15:27 #5
ok
Avatar billede hrc Mester
19. december 2007 - 11:18 #6
Lige på faldrebet. Du kender ikke en metode til at tjekke om man kan foretage en opdatering vel? Løsningen med at polle en opdatering af databasen dur ikke.
Avatar billede arne_v Ekspert
20. december 2007 - 01:58 #7
Med 2005 er det nemt - den har en notification service og man kan selv lave en trigger
ned noget C# kode.

Den kan også fåes som addon til 2000:
  http://www.microsoft.com/downloads/details.aspx?FamilyID=AE73472B-5D7C-4266-94D4-7DDE7E315B98&displaylang=en

måske var der noget som kunne bruges. Måske er det for .NET adhængigt.

En mere traditionel løsning ville være at lade alle updates gå gennem en server side
app som så pushede updates til alle klienter.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester