TDataSet, zapis i aktualizacja + strumień

0

Witam,

Szukałem po google i po forum ale nie znalazłem nic co rozwiązało by mój problem.
A więc tak, jest sobie TDataSet (TSQLDataSet) i do tego jest tabela:
"TABELA" ( ID INTEGER PRIMARY KEY, TEKST VARCHAR(40) AUTO_INCEREMET, DANE BLOB SEGMENTSIZE 1); (tutaj FB2 Embeded, AI zrobiony na triggerze i procedurze)
I do tej pory (nie miałem potrzeby barrdziej wgłębiać się w nie - te komponenty) i używam tylko SQLConnection, SQLQuery i czasami DataSet głównie gadam z bazą za pomocą zapytań ,które przypisuję do SQLQuery.SQL.Text =: INSERT, UPDATE, DELETE ,a zaś SELECT robię tak (standard?):

   DataSet(albo SQLQuery).SQL.Text := 'SELECT ...';
   ...
   SQLQuery.Open;
   for i := 1 to SQLQuery.RecordCount do 
      ..... 
      SQLQuery.Next;
   end;
   SQLQuery.Close;

Wszystko to działa mi dobrze dopóki używam prostych typów: string, integer, datetime i itd... Jednak problem pojawił mi się w momencie, kiedy chciałem w bazie trzymać większe dane (obrazki/ dłuższy tekst (VARCHAR odpada)) więc typ blob jest jak znalazł ale nie umiem ,a bardziej nie wiem jak obsłużyć go w INSERT i UPDATE ,bo w SELECT to nie powinienm mieć problemu ponieważ kod nie jest zadną niewiadmomą co przed i po nim stoi;
znalazłem to: http://www.scalabium.com/faq/dct0141.htm i odczyt mam napisany tak (przykładowy kod skopiowany z programu):

   // Query1 = TSQLQuery od DBX
   Query1.SQL.Text := 'SELECT * FROM '+OP_TABLE+' ORDER BY ID ASC';
   if DebugMode then AddLog('<color=$006C6C6C>'+Query1.SQL.Text+'</color>');
   try
      Query1.Open;
      if Query1.RecordCount > 0 then begin
         lvMain.Items.BeginUpdate;
         lvMain.Clear;
         for i := 1 to Query1.RecordCount do begin
            li := lvMain.Items.Add;
            li.Caption := VarToStr(Query1.FieldValues['ID']);
            li.SubItems.Add(Trim(VarToStr(Query1.FieldValues[OP_VALUE_COL])));
            li.Data := Pointer(VarToInt(Query1.FieldValues['ID']));
            Query1.Next;
         end;
      end;
   finally
      lvMain.Items.EndUpdate;
      Query1.Close;
   end;

I mam prośbę czy mógł by ktoś podpowiedzieć co i jak po kolei dla wiersza który chce aktualizować/dodać? (dla tabeli co wspomniałem na początku), bardzo proszę :) Jak wszystko będzie dobrze to mogę podesłać to do "Delphi.Gotowce" :)

0

Wyprodukowałem takie coś, ale w momencie Insert dostaję "Cannot modify a read-only dataset". Jak to zmienić?

         ds := TSQLDataSet.Create(self);
         ds.SQLConnection := Conn;
         ds.CommandText := 'SELECT * FROM '+OP_TABLE;
         ds.Open;
         ds.Insert;
         ds.Edit;
         ds.FieldByName('GROUP_NAME').AsString := f.edtName.Text;
         ds.FieldByName('HOME_PAGE').AsString := f.edtWeb.Text;
         ds.FieldByName('ID').AsVariant := varNull;
            st := ds.CreateBlobStream(ds.FieldByName('DESCRIPTION'),bmWrite);
            f.mDesc.Lines.SaveToStream(st);
         ds.Post;
         ds.UpdateRecord;
         ds.Close;
         ds.Free;
         st.Free;

Jeśli w CommandText wpiszę "INSERT INTO..." to w momencie OPEN wykona mi zapytanie ,a ja chcę dodać strumień i dopiero zapisać do DB.
Bo z odczytem z DB strumienia to nie mam problemu. Tylko ten zapis :(

0

Chyba nikt nie pomoże... , ( A to polska właśnie... );
Admin do kosza ten wątek proszę bo trzymanie bez odpowiedzi i rozwiązania nie ma sensu - tylko zaśmieca.

0
SAPER napisał(a)

( A to polska właśnie... )
<font size="4">co to prostytutka za stwierdzenie??!! Płacisz nam czy jak?? Zobowiązywał się ktoś do pomagania właśnie tobie?? Może nikt nie zna odpowiedzi, a może nikt nie ma czasu ci odpisać albo nikomu się nie chce grzebać w googlach zamiast ciebie...</span>

0

yhhh ;-( ... Nie obrażaj się, nie miałem na celu nikogo obrazić... Chodziło mi o to ,że w polskim internecie nie ma żadnej pomocy/wzmianki/rozwiązania na ten temat (w sumie to nawet i nie polskim tylko).
Odpowiedź znalazłem całkiem przypadkowo (w dodatku na formu poświęconym C++) i gybym nie przypomniał sobie o zeos'ie to dalej nie wiedziałbym jak to zrobić... A w GOOGLE nie znalazłem odpowiedzi na mój problem, i z tego względu forum było ostatnią moją deską.
Po tym DBX dostaje ode mnie DUŻY minus...
Rzowiązanie dla przyszłych:

         ZTable1.TableName := OP_TABLE;
         ZTable1.Open;
         ZTable1.Insert;
         ZTable1.Edit;
         ZTable1.FieldByName('GROUP_NAME').AsString := f.edtName.Text;
         ZTable1.FieldByName('DESCRIPTION').SetFieldType(ftBlob);
         st := ZTable1.CreateBlobStream(ZTable1.FieldByName('DESCRIPTION'), bmWrite); // st : TStream;
            f.mDesc.Lines.SaveToStream(st);
         TBlobField(ZTable1.FieldByName('DESCRIPTION')).LoadFromStream(st);
         ZTable1.UpdateRecord;
         ZTable1.Post;
         ZTable1.Close;
         st.Free;

1 użytkowników online, w tym zalogowanych: 0, gości: 1