Databáze > MS SQL

Editace ADODataset

(1/2) > >>

Petr Shejbal:
Dobrý den přeji,

Příběh.

* Potřebuji nahradit hodnoty recordsetu (pod oběktem
--- Kód: --- TADODataset
--- Konec kódu ---
). Tzn. nahradit texty některých buňěk.
Na počátku je objekt
--- Kód: ---TADOSQLQuery
--- Konec kódu ---
, který po spuštění vrátí "kolekci" rekordsetů.

* První dataset naplním pomocí
--- Kód: ---ADODataset1.Recordset := ADOSQLQuery.Recordset;
--- Konec kódu ---

* Zbylé datasety naplním metodou
--- Kód: ---ADODatasetN.Recordset := ADOSQLQuery.Nextrecordset;
--- Konec kódu ---
Dále mám proceduru pro nahrazení textu. (pouštím ji pro každý dataset.)[/li]


--- Kód: ---procedure transformFormTexts(dataset:TADODataSet;);
begin
   dataset.Open;
   dataset.Active;
   dataset.First;
   while not dataset.Eof do
    begin
    dataset.Connection := nil;
    dataset.Edit;
      for i := 0 to dataset.Fields.Count - 1 do
        begin         
              if podmínka  then
              begin               
                     dataset.Fields[i].ReadOnly :=false;
                     dataset.Fields[i].Value := string(data.ChildNodes[ii].Text);                           
              end;
           
        end;
        dataset.next;
    end;
end;
--- Konec kódu ---

Poznámka.
Nepotřebuji držet živé spojení s databází, proto dataset.Connection := nil;
Druhý důvod je chyba "insufficient key column information for updating or refreshing" při metodě post.

Výsledek.
Data se nahradí pouze v prvním datasetu (přiřazen pomocí ADOSQLQuery.Recordset; [nevím jestli to má souvislost, ale jiný rozdíl nevidím])
Při pokusu o nahrazení ostatních datasetech dojde k chybě "Field 'Jméno fieldu' cannot be modified".

Předem děkuji za Váš čas.

96887:
Nemuzu zreprodukovat. Dataset se po zruseni prirazeni Connection chova jako storage, coz ma pokud to spravne chapu byt ucelem.

Delphi 2009
ADOQuery1 - TADOQuery (neznam nic jako TADOSQLQuery)
ADOConnection1 - TADOConnection objekt pripojujici se pres nativniho klienta k LocalDb instanci Microsoft SQL Server Express 2014 v12.0.2000.8, connection string:


--- Citace ---Provider=SQLNCLI11.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=MyDatabase;Data Source=(LocalDb)\MyLocalDB;Initial File Name="";Server SPN=""
--- Konce citace ---

Skript pro vytvoreni tabulek (ani jedna z nich nema umyslne kvuli testu zminene chyby "insufficient key column information" primarni klic):


--- Kód: MySQL ---CREATE TABLE [dbo].[MyTable1](        [ID] [int] NOT NULL,        [MyField] [nvarchar](50) NOT NULL); CREATE TABLE [dbo].[MyTable2](        [MyField] [nvarchar](50) NOT NULL); GO INSERT INTO [dbo].[MyTable1] ([ID], [MyField]) VALUES (0, 'MyValue1');INSERT INTO [dbo].[MyTable2] ([MyField]) VALUES ('MyValue2');
A osklivy kod pro test:


--- Kód: Delphi ---var  Affected: Integer;  DataSet1: TADODataSet;  DataSet2: TADODataSet;begin  ADOQuery1.SQL.Text := 'SELECT MyField FROM MyTable1; SELECT MyField FROM MyTable2;';  ADOQuery1.Open;   DataSet1 := TADODataSet.Create(nil);  try    DataSet2 := TADODataSet.Create(nil);    try      DataSet1.Recordset := ADOQuery1.Recordset;      DataSet1.Open;      DataSet2.Recordset := ADOQuery1.NextRecordset(Affected);      DataSet2.Open;       ADOQuery1.Connection := nil;      DataSet1.Connection := nil;      DataSet2.Connection := nil;       Memo1.Lines.Add(DataSet1.Fields[0].AsString);      Memo1.Lines.Add(DataSet2.Fields[0].AsString);       DataSet1.Edit;      DataSet1.Fields[0].AsString := 'New value 1';      DataSet1.Post;       DataSet2.Edit;      DataSet2.Fields[0].AsString := 'New value 2';      DataSet2.Post;       Memo1.Lines.Add(DataSet1.Fields[0].AsString);      Memo1.Lines.Add(DataSet2.Fields[0].AsString);    finally      DataSet2.Free;    end;  finally    DataSet1.Free;  end;   ADOQuery1.Connection := ADOConnection1;  ADOQuery1.SQL.Text := 'SELECT A.MyField, B.MyField FROM MyTable1 A, MyTable2 B';  ADOQuery1.Open;   Memo1.Lines.Add(ADOQuery1.Fields[0].AsString);  Memo1.Lines.Add(ADOQuery1.Fields[1].AsString);end;
Vystup memo (bez modifikace tabulky databaze):


--- Citace ---MyValue1
MyValue2
New value 1
New value 2
MyValue1
MyValue2
--- Konce citace ---

Petr Shejbal:
Předem Vám chci poděkovat za pohotovou reakci spolu s příkladem.

1. Máte pravdu, že je účel aby dataset sloužil pouze jako storage.
2. TADOSQLQuery byl samozdřejmě překlep : ) Měl jsem, jak jste správně odhadl, na mysli TADOQuery.

Příklad se mi podařilo úspěšně zdeprodukovat a mé bádání to posunulo o něco dále.
Program kolabuje když chce modifikovat sloupce, které se byly ve stored procedure přidány jako alias.
'<%&LModifikoval%>' as LModifikoval
Ostatní sloupce se již přepisují podle potřeby.

96894:

--- Citace: Petr Shejbal  06-09-2017, 14:44:37 ---Příklad se mi podařilo úspěšně zdeprodukovat a mé bádání to posunulo o něco dále.
Program kolabuje když chce modifikovat sloupce, které se byly ve stored procedure přidány jako alias.
'<%&LModifikoval%>' as LModifikoval
Ostatní sloupce se již přepisují podle potřeby.

--- Konce citace ---

Porad nic. I pri vraceni multiple resulsetu pouzivajicich aliasy sloupcu z procedury se mi vse chova jak ma. Jeste dodam ze jsem na Windows 7 Professional.

Jde o tohle? Pokud ne, prosim o upresneni a podobnou, nejjednodussi spustitelnou ukazku k reprodukci.


--- Kód: MySQL ---CREATE PROCEDURE [dbo].[MyProc]ASBEGIN   -- SET NOCOUNT ON added to prevent extra result sets from   -- interfering with SELECT statements.   SET NOCOUNT ON;    SELECT MyField AS MyFieldAlias FROM MyTable1;   SELECT MyField AS MyFieldAlias FROM MyTable2;END
A kod ktery jsem postnul predtim, jen upraveny v SQL prikazu:


--- Kód: Delphi ---  ...  ADOQuery1.SQL.Text := 'EXECUTE MyProc';  ADOQuery1.Open;  ...

Petr Shejbal:
V příloze přikládám zip funkčního příkladu spolu se scriptem.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi